我要对列表进行排序:(2012-09, 2012-10,2012-11,2012-12,2013-01, 2013-02,2013-03,2013-04,2013-05, 2013-06,2013- 07,2013-08)
进入新列表(2013-01、2013-02、2013-03、2013-04 等,2012-09、2012-10)
我怎么能在 C# 中做到这一点?
我要对列表进行排序:(2012-09, 2012-10,2012-11,2012-12,2013-01, 2013-02,2013-03,2013-04,2013-05, 2013-06,2013- 07,2013-08)
进入新列表(2013-01、2013-02、2013-03、2013-04 等,2012-09、2012-10)
我怎么能在 C# 中做到这一点?
尝试这个:
var sorted = notSorted.OrderByDescending(x => x.Year).ThenBy(x => x.Month).ToList();
它将对您的 DateTimes 进行排序(我假设它们是 DateTimes),首先在 Year 降序然后在 Month 升序,因此它将生成您期望的列表
如果不是,您可以使用或DateTimes
解析它们DateTime.Parse
DateTime.ParseExact
阅读有关OrderBy和ThenBy的更多信息
如果列表是List<string>
您可以使用以下代码
lst = lst.OrderByDescending(a => a.Substring(0, 4)).OrderBy(a => a.Substring(5, 2)).ToList();
如果您的列表不包含日期时间对象而是字符串,您可以按以下方式对它们进行排序:
var unsortedArray = new string[] { "2012 - 09", "2012 - 10", "2012 - 11", "2012 - 12", "2013 - 01", "2013 - 02", "2013 - 03", "2013 - 04", "2013 - 05", "2013 - 06", "2013 - 07", "2013 - 08" };
var sortArray = unsortedArray.Select(x =>
{
var split = x.Split(new string[] { " - " }, StringSplitOptions.None);
return new { Original = x, Year = split[0], Month = split[1] };
})
.OrderByDescending(x => x.Year)
.ThenBy(x => x.Month)
.Select(x => x.Original)
.ToArray();
您可以创建自己的 IComparer 实现来处理这个问题,如果您的数据结构发生变化,这可能会带来更多的可维护性。
这是与您提供的示例一起使用的粗略示例。
public class MonthYearStringComparer : IComparer<string>
{
public int Compare(string x, string y)
{
if (x == null && y == null) return 0;
if (x == null) return -1;
if (y == null) return 1;
int[] xArray = x.Split('-').Select(xVal => int.Parse(xVal)).ToArray();
int[] yArray = y.Split('-').Select(yVal => int.Parse(yVal)).ToArray();
// x year is earlier
if (xArray[0] < yArray[0]) return 1;
// y year is earlier
if (xArray[0] > yArray[0]) return -1;
// years are same
// x month is earlier
if (xArray[1] < yArray[1]) return 1;
// y month is earlier
if (xArray[1] > yArray[1]) return -1;
// same
return 0;
}
http://msdn.microsoft.com/en-us/library/234b841s.aspx
然后您所要做的就是实例化您的排序器并将其用作排序方法中的参数。
MonthYearStringComparer comparer = new MonthYearStringComparer();
myListOfYearAndMonthStrings.Sort(comparer);