C# LINQ Orderby子句导致了奇怪的结果

C# LINQ Orderby子句导致了奇怪的结果,c#,linq,C#,Linq,我创建了以下LINQ查询来演示该问题: string[] dateStrings = new string[] { "2009-07-20 13:00:00", "2009-07-20 16:00:00", "2009-07-20 09:00:00" }; DateTime dateValue = DateTime.MinValue; var results = from dateString in dateStrings where DateTime.TryPars

我创建了以下LINQ查询来演示该问题:

string[] dateStrings = new string[] { "2009-07-20 13:00:00", "2009-07-20 16:00:00", "2009-07-20 09:00:00" };

DateTime dateValue = DateTime.MinValue;    

var results =
    from dateString in dateStrings
    where DateTime.TryParse(dateString, out dateValue)
    orderby dateValue descending
    select dateValue;
您希望结果是一个日期时间列表,顺序相反:
20-7-2009 16:00:00
20-7-2009 13:00:00
20-7-2009 9:00:00

然而,我得到的只是:
20-7-2009 9:00:00
20-7-2009 9:00:00
20-7-2009 9:00:00

我做错了什么?
如果删除orderby语句,您会注意到一个DateTime的正常列表。

在哪里声明了dateValue?请注意,它只能保存一个值

请尝试以下方法:

string[] dateStrings = new string[] { "2009-07-20 13:00:00",
  "2009-07-20 16:00:00", "2009-07-20 09:00:00" };

var results =
dateStrings.Select(s => 
{
  DateTime v;
  bool parsed = DateTime.TryParse(s, out v);
  return new {Parsed = parsed, Value = v };
})
.Where(x => x.Parsed)
.Select(x => x.Value)
.OrderByDescending(d => d);

dateValue在哪里声明?请注意,它只能保存一个值

请尝试以下方法:

string[] dateStrings = new string[] { "2009-07-20 13:00:00",
  "2009-07-20 16:00:00", "2009-07-20 09:00:00" };

var results =
dateStrings.Select(s => 
{
  DateTime v;
  bool parsed = DateTime.TryParse(s, out v);
  return new {Parsed = parsed, Value = v };
})
.Where(x => x.Parsed)
.Select(x => x.Value)
.OrderByDescending(d => d);

这是由延迟执行引起的

dateValue
只能有一个值,它将是日期字符串中的最后一个值

阅读以下文章了解原因:


这是由延迟执行引起的

dateValue
只能有一个值,它将是日期字符串中的最后一个值

阅读以下文章了解原因:

var结果= 从日期字符串中的日期字符串 其中DateTime.TryParse(日期字符串,out dateValue) OrderByDateValue降序 选择日期值

我相信Linq对查询使用的是延迟执行,而不是TryParse,因此您只能从TryParse获取查询实际执行时日期的最后一个值

尝试将解析日期移动到数组中,然后使用适当的Linq构造来执行逻辑

var结果= 从日期字符串中的日期字符串 其中DateTime.TryParse(日期字符串,out dateValue) OrderByDateValue降序 选择日期值

我相信Linq对查询使用的是延迟执行,而不是TryParse,因此您只能从TryParse获取查询实际执行时日期的最后一个值

尝试将解析日期移动到数组中,然后使用适当的Linq构造来执行逻辑。

尝试该方法

       var results =
            from dateString in dateStrings
            orderby (Convert.ToDateTime(dateString)) descending
            select (Convert.ToDateTime(dateString));
试试这个方法

       var results =
            from dateString in dateStrings
            orderby (Convert.ToDateTime(dateString)) descending
            select (Convert.ToDateTime(dateString));

orderby
子句要求首先执行
where
子句。
orderby
where
之后应用,它需要所有的结果来执行
orderby
操作。因此,
dateValue
将始终包含最后一个where结果

这里有一个解决方案:

        var results = from date in
                           (
                               from dateString in dateStrings
                               where DateTime.TryParse(dateString, out dateValue)
                               select dateValue
                           )
                      orderby date descending
                      select date;

orderby
子句要求首先执行
where
子句。
orderby
where
之后应用,它需要所有的结果来执行
orderby
操作。因此,
dateValue
将始终包含最后一个where结果

这里有一个解决方案:

        var results = from date in
                           (
                               from dateString in dateStrings
                               where DateTime.TryParse(dateString, out dateValue)
                               select dateValue
                           )
                      orderby date descending
                      select date;

我正在阅读VisualStudio2008开始页上的主题,注意到一个关于“let”关键字的主题。这让我想到了下面的解决方案:

string[] dateStrings = new string[] { "2009-07-20 13:00:00", "2009-07-20 16:00:00", "2009-07-20 09:00:00" };

DateTime dateVal = DateTime.MinValue; 

var results =
from dateString in dateStrings
where DateTime.TryParse(dateString, out dateVal)
let dateValue = dateVal
orderby dateValue descending
select dateValue;
请注意,我所做的只是添加行并相应地重命名变量:

let dateValue = dateVal

非常简单有效。

我正在阅读Visual Studio 2008的起始页上的主题,注意到一个关于“let”关键字的主题。这让我想到了下面的解决方案:

string[] dateStrings = new string[] { "2009-07-20 13:00:00", "2009-07-20 16:00:00", "2009-07-20 09:00:00" };

DateTime dateVal = DateTime.MinValue; 

var results =
from dateString in dateStrings
where DateTime.TryParse(dateString, out dateVal)
let dateValue = dateVal
orderby dateValue descending
select dateValue;
请注意,我所做的只是添加行并相应地重命名变量:

let dateValue = dateVal

非常简单有效。

很抱歉,在本例中忘记键入该选项。我已经更新了这个问题。如果没有orderby,一切都很好。orderby必须急切地解决该点以上的查询,然后才能继续订购。where子句处理完所有三条记录后,dateValue的值已获得其最终值。然后orderby根据该值进行操作和排序。然后选择一个值为3倍的操作和项目。Thnx!我可以保持查询不变。但是,我可以在将orderby设置为我的数据源之前进行排序,而不是将其作为Linq查询的一部分。我已经更新了这个问题。如果没有orderby,一切都很好。orderby必须急切地解决该点以上的查询,然后才能继续订购。where子句处理完所有三条记录后,dateValue的值已获得其最终值。然后orderby根据该值进行操作和排序。然后选择一个值为3倍的操作和项目。Thnx!我可以保持查询不变。但是,我可以在将orderby设置到数据源之前进行排序,而不是将其作为Linq查询的一部分。