-1

我要对列表进行排序:(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# 中做到这一点?

4

4 回答 4

4

尝试这个:

var sorted = notSorted.OrderByDescending(x => x.Year).ThenBy(x => x.Month).ToList();

它将对您的 DateTimes 进行排序(我假设它们是 DateTimes),首先在 Year 降序然后在 Month 升序,因此它将生成您期望的列表

如果不是,您可以使用或DateTimes解析它们DateTime.ParseDateTime.ParseExact

阅读有关OrderByThenBy的更多信息

于 2013-09-19T12:54:01.797 回答
0

如果列表是List<string>您可以使用以下代码

lst = lst.OrderByDescending(a => a.Substring(0, 4)).OrderBy(a => a.Substring(5, 2)).ToList();
于 2013-09-19T13:13:11.090 回答
0

如果您的列表不包含日期时间对象而是字符串,您可以按以下方式对它们进行排序:

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();
于 2013-09-19T13:04:04.340 回答
0

您可以创建自己的 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);
于 2013-09-19T13:46:27.850 回答