我有一个表示缩写月份的字符串列表:Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
如果我按随机顺序获取这些值,我该如何订购它们:Jan, Feb, Mar ...
?
List<string> months = new List<string>();
答案 0 :(得分:2)
为什么不使用这个有序列表:
List<string> months = Enumerable.Range(1, 12)
.Select(m => DateTimeFormatInfo.InvariantInfo.GetAbbreviatedMonthName(m))
.ToList();
列表包含:
[0] "Jan"
[1] "Feb"
[2] "Mar"
[3] "Apr"
[4] "May"
[5] "Jun"
[6] "Jul"
[7] "Aug"
[8] "Sep"
[9] "Oct"
[11] "Dec"
如果您想使用当前语言的月份名称:
DateTimeFormatInfo.CurrentInfo.GetAbbreviatedMonthName(m)
如果您现在有另一个包含月份名称的列表,并且此列表包含重复项或未完成但您想自然地订购此列表,那么您可以使用IndexOf
:
monthList = monthList.OrderBy(s => months.IndexOf(s)).ToList();
这是另一种方法,不需要另一个列表进行比较,但使用DateTime.ParseExact
:
monthList = monthList
.OrderBy(s => DateTime.ParseExact(s, "MMM", DateTimeFormatInfo.InvariantInfo))
.ToList();
答案 1 :(得分:0)
已经为您制作了一个:)
从中检查出来 DateTimeFormatInfo.MonthNames
public string [] MonthNames {get;组; }
String类型的一维数组,包含月份的特定于文化的全名。在12个月的日历中,数组的第13个元素是空字符串。 InvariantInfo的数组包含“January”,“February”,“March”,“April”,“May”,“June”,“July”,“August”,“September”,“October”,“November”,“十二月“,和”“。
编辑:我发现This question 可能有用
答案 2 :(得分:0)
您可以使用DateTime.ParseExact
方法来实现此目标
var months = new[] { "Jan", "Apr", "Sep", "Oct", "May", "Jun", "Jul", "Feb", "Mar", "Aug", "Nov", "Dec" };
var sortedMonthNames = months
.Select(m => new {Name = m, Date = DateTime.ParseExact(m, "MMM", CultureInfo.InvariantCulture)})
.OrderBy(m => m.Date.Month)
.Select(m => m.Name)
.ToArray();
答案 3 :(得分:0)
您可以订购并重新创建按月号排序的列表:
string[] months = {"feb", "oct", "apr", "jan"};
List<string> orderedMonths = months.OrderBy(m => DateTime.Parse("2000" + m + "1")).ToList();
答案 4 :(得分:0)
您可以使用LINQ.OrderBy()方法,在字符串数组的帮助下使用正确的格式,使用Array.IndexOf()方法来比较值:
class Program
{
static readonly string[] format = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
static void Main()
{
string[] sorted = (new[] { "Jul", "Jan", "May" }).OrderBy(v => Array.IndexOf(format, v)).ToArray();
for (int i = 0; i < sorted.Length; i++)
{
Console.WriteLine(sorted[i]);
}
}
}
输出:Jan,May,Jul