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] });