C# 动态更改月份列表

C# 动态更改月份列表,c#,linq,foreach,C#,Linq,Foreach,我被一个要求困住了。 我从数据库中获得两个标志,即lastMonthNumber和lastMonthName,它们的范围从1到12和一月到十二月。 现在我有一个要求,如果lastMonthName=“March”和lastMonthNumner=12,那么父列表应如下所示: 1, April 2, May 3, June 4, July 5, August 6, September 7, October 8, November 9, December 10, January 11, Februa

我被一个要求困住了。 我从
数据库
中获得两个标志,即
lastMonthNumber
lastMonthName
,它们的范围从
1到12
一月到十二月
。 现在我有一个要求,如果
lastMonthName=“March”
lastMonthNumner=12
,那么父
列表应如下所示:

1, April
2, May
3, June
4, July
5, August
6, September
7, October
8, November
9, December
10, January
11, February
12, March
如果
lastMonthName=“April”
lastMonthNumber=6
,则列表应为:

7, November
8, December
9, January
10, February
11, March
12, April
lastMonthNumber
的范围可以是
1到12
lastMonthName
的范围也可以是
1月到12月
。父
列表
需要是动态的

如果
lastMonthNumber=6
lastMonthName=“April”
,则
列表需要有6个元素,其中April为12,回溯则总共有6个元素

列表
可以是
字典
,例如:

var monthsDictionary=new Dictionary<int, string>();
var monthsdirectionary=newdictionary();
我正在尝试以下内容,但无法进一步想象:

var monthsDictionary = new Dictionary<int, string>();
var numbers = new List<int> { 1,2,3,4,5,6,7,8,9,10,11,12};
var months = new List<string> {"January","February","March","April","May","June","July","August","September","October","November","December" };
 foreach (var month in months.Select())
     {
         if (month == lastMonthName)
            {

            }
      }
var monthsdirectionary=newdictionary();
变量数=新列表{1,2,3,4,5,6,7,8,9,10,11,12};
var月=新列表{“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
foreach(变量月份,以月为单位。选择())
{
如果(月==最后一个月)
{
}
}
请帮忙。指针将非常有用。

var-monthsdirectionary=newdictionary();
    var monthsDictionary = new Dictionary<int, string>();
    var numbers = new List<int> { 1,2,3,4,5,6,7,8,9,10,11,12};
    var months = new List<string> {"January","February","March","April","May","June","July","August","September","October","November","December" };
int flag=0;
int items=12;
var numbersList = new List<int>();
var monthsList = new List<string>(); 
     foreach (var month in months)
         {
            if(flag==0){
             monthsList.Insert(items--,month);
             if (month == lastMonthName)
                {
                    flag=1;
                }
}
         else if(flag==1)
         {
           monthsList.add(month);
          }
          }
flag=0;
变量数=新列表{1,2,3,4,5,6,7,8,9,10,11,12}; var月=新列表{“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”}; int标志=0; 整数项=12; var numbersList=新列表(); var monthsList=新列表(); foreach(var月,以月为单位) { 如果(标志==0){ 月列表。插入(项目--,月); 如果(月==最后一个月) { flag=1; } } else if(标志==1) { 月列表。添加(月); } } flag=0;
有一个带有月份名称的常量

private readonly string[] monthNames = { "Januar" ..., "December" };
以及能够循环索引的访问器方法:

private string GetMonthName(int index)
{
  if (index < 0) return monthNames[monthNames.Length - 1 - (index % monthNames.Length)];
  return monthNames[index % monthNames.Length];
}
然后将其填充到适当的数据结构中。e、 g.像这样:

List<Tuple<int, string>> parentList = parentData
  .Select(x => Tuple.Create(x.Number, x.Name)))
  .ToList();
试试这个linq查询

var months = new List<string> {"January","February","March","April","May","June","July","August","September","October","November","December" };

var lastMonthNumber = ...;
var lastMonthName = ....;

var rows = months.Concat(months)
    .Reverse()
    .SkipWhile(m => m != lastMonthName)
    .Take(lastMonthNumber)
    .Reverse()
    .Select((m, i) => new { id = i + 12 - lastMonthNumber + 1, m})
    .ToArray();
var months=新列表{“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
var lastMonthNumber=。。。;
var lastMonthName=。。。。;
变量行=月数。Concat(月数)
.Reverse()
.SkipWhile(m=>m!=lastMonthName)
.拍摄(上个月编号)
.Reverse()
.Select((m,i)=>new{id=i+12-lastMonthNumber+1,m})
.ToArray();
它复制一个月列表,将其反转并跳过项目,直到找到
lastMonthName
。在此之后,此代码将结果项计数限制为
lastMonthNumber
,并将列表倒回尝试以下操作。

私有静态字典GetRequiredResult(int lastMonthNumber,string lastMonthName)
{
var indx=月份指数(lastMonthName);
//在此列表中,以lastMonthName结尾的月份按要求的顺序排列
var ReviedMonthList=新列表();
修订的MonthList.AddRange(月数.跳过(indx+1).Take(12));
修订的月列表添加范围(月数(indx+1));
//获取count=lastMonthNumber元素,然后将它们转换为字典。
返回已修改的月列表
.Select((mn,index)=>new{index,mn})
.Where(c=>c.index>=months.Count-lastMonthNumber)
.ToDictionary(c=>c.index+1,c=>c.mn);
}
尝试以下操作:

        var months = Enumerable.Range(1, 12).Select(i => new
        {
            I = i,
            M = System.Globalization.DateTimeFormatInfo.CurrentInfo.GetMonthName(i)
        });

        //string lastMonthName = "March"; int lastMonthNumber = 12;
        //string lastMonthName = "April"; int lastMonthNumber = 6;
        var selMonthInt = months.Where(x => x.M == lastMonthName).Select(y => y.I).FirstOrDefault();
        int endCount = lastMonthNumber + selMonthInt;
        if (endCount >= 12) { endCount = selMonthInt; }

        var lst1 = months.Where(x => x.I > endCount).Select(z => z.M);
        var lst2 = months.Where(x => x.I <= selMonthInt).Select(z => z.M);
        var lst = lst1.Union(lst2).ToArray();

        var selMonths = Enumerable.Range(0, lastMonthNumber).Select(i => new { I = (13 - lastMonthNumber + i), M = lst[i] });
var months=Enumerable.Range(1,12)。选择(i=>new
{
I=I,
M=System.Globalization.DateTimeFormatInfo.CurrentInfo.GetMonthName(i)
});
//字符串lastMonthName=“三月”;int lastMonthNumber=12;
//字符串lastMonthName=“April”;int lastMonthNumber=6;
var selMonthInt=months.Where(x=>x.M==lastMonthName).选择(y=>y.I).FirstOrDefault();
int endCount=lastMonthNumber+selMonthInt;
如果(endCount>=12){endCount=selMonthInt;}
var lst1=月份。其中(x=>x.I>endCount)。选择(z=>z.M);
var lst2=月份,其中(x=>x.I z.M);
var lst=lst1.Union(lst2.ToArray();
var selmonments=Enumerable.Range(0,lastMonthNumber).Select(i=>new{i=(13-lastMonthNumber+i),M=lst[i]});

在lastMonthName=“April”和lastMonthNumber=6的示例中,如何确定需要显示/返回的所有值?列表需要回溯。如果lastMonthNumber=6,则父列表需要有6个元素;如果lastMonthName=April,则需要从April开始回溯有6个元素的列表。希望现在就清楚了。你的意思是,如果我们可以将lastMonthName='Oct'和lastMonthNumber=2,那么结果将是
11-Sep,12-Oct
?@DeepakSharma是的,你是对的。对数字列表执行相同的过程,然后你可以将其添加到你的字典对象中。我将尝试代码并让你知道。谢谢。IndexOf并不是只接受一个参数。好的,它是一个数组。我应该使用
Array.IndexOf
-修复。我修复了一些小问题。谢谢..我会看一看。我会尝试代码并让您知道。谢谢。如果数据实际上是一个序列(列表),并且不希望通过月号访问,我就不会使用字典。@StefanSteinegger,从列表返回字典,因为OP提到,返回响应可以是的字典
var months = new List<string> {"January","February","March","April","May","June","July","August","September","October","November","December" };

var lastMonthNumber = ...;
var lastMonthName = ....;

var rows = months.Concat(months)
    .Reverse()
    .SkipWhile(m => m != lastMonthName)
    .Take(lastMonthNumber)
    .Reverse()
    .Select((m, i) => new { id = i + 12 - lastMonthNumber + 1, m})
    .ToArray();
private static Dictionary<int, string> GetRequiredResult(int lastMonthNumber, string lastMonthName)
{
    var indx =  months.IndexOf(lastMonthName);

    // here this list will have months in required order that ends with lastMonthName
    var revisedMonthList = new List<string>();
    revisedMonthList.AddRange(months.Skip(indx + 1).Take(12));
    revisedMonthList.AddRange(months.Take(indx + 1));

    // get count = lastMonthNumber element from last using index, and then convert them to dictionary.
    return revisedMonthList
        .Select((mn, index) => new {index, mn})
        .Where(c => c.index >= months.Count - lastMonthNumber)
        .ToDictionary(c=>c.index + 1, c=>c.mn); 
}
        var months = Enumerable.Range(1, 12).Select(i => new
        {
            I = i,
            M = System.Globalization.DateTimeFormatInfo.CurrentInfo.GetMonthName(i)
        });

        //string lastMonthName = "March"; int lastMonthNumber = 12;
        //string lastMonthName = "April"; int lastMonthNumber = 6;
        var selMonthInt = months.Where(x => x.M == lastMonthName).Select(y => y.I).FirstOrDefault();
        int endCount = lastMonthNumber + selMonthInt;
        if (endCount >= 12) { endCount = selMonthInt; }

        var lst1 = months.Where(x => x.I > endCount).Select(z => z.M);
        var lst2 = months.Where(x => x.I <= selMonthInt).Select(z => z.M);
        var lst = lst1.Union(lst2).ToArray();

        var selMonths = Enumerable.Range(0, lastMonthNumber).Select(i => new { I = (13 - lastMonthNumber + i), M = lst[i] });