订购通用列表不能按预期工作?

时间:2013-01-31 18:48:52

标签: c# linq

为了简化我的问题,我将举例说明。 假设我有一个包含objectsdatetime属性的integer列表。 我首先按datetime字段然后按integer属性订购我的列表项。

Item #   Date Value  Int Value
  1      2012-01-01     0
  2      2012-01-01     4
  3      2012-01-01     6
  4      2012-01-01     13

说我的list中有4个项目(首先是未订购的,上面是我希望它最终的方式)。

我只是通过以下方式订购它们:

myList = myList.OrderBy(v=>v.MyDateValue).ThenBy(v=>v.MyIntValue).ToList();

执行上面的行后,结果如下:

Item #   Date Value  Int Value
  1      2012-01-01     0
  4      2012-01-01     13
  2      2012-01-01     4
  3      2012-01-01     6

起初我认为它可能会将int值解释为string或许(可能不是一个逻辑陈述,只是在相当长的一段时间内使用它)然后我改变了我的int值为10,11,12,13,但结果仍然相同。

知道为什么这不起作用?或者我做错了什么?

1 个答案:

答案 0 :(得分:2)

解决方法:如果您对时间不感兴趣,请将关键选择器更改为v => v.DateValue.Date

我无法复制您描述的行为。以下按预期工作:

    private class Foo
    {
        public DateTime Date { get; set; }
        public int Id { get; set; }
    }

    static void Main(string[] args)
    {
        var myList = new List<Foo>
                         {
                             new Foo {Date = new DateTime(2012, 01, 01), Id = 12},
                             new Foo {Date = new DateTime(2012, 01, 01), Id = 1},
                             new Foo {Date = new DateTime(2012, 01, 03), Id = 7},
                             new Foo {Date = new DateTime(2012, 01, 01), Id = 4},
                         };

        var newList = myList.OrderBy(v => v.Date).ThenBy(v => v.Id).ToList();
        foreach (var f in newList)
        {
            Console.WriteLine("{0}, {1}", f.Date, f.Id);
        }

        Console.ReadLine();
    }

输出项目顺序为1,4,12和7.(7是最后一个,因为它的日期更晚。)

我怀疑您有DateTime不是0的Time值。

通过将密钥选择器更改为v => v.DateValue.Date来确认。