连接LINQ查询和LINQ排序语句

时间:2013-04-30 22:28:46

标签: linq c#-4.0

我在加入两个LINQ查询时遇到问题。

目前,我的(原始)代码看起来像这样

s.AnimalTypes.Sort((x, y) => string.Compare(x.Type, y.Type));

我需要做的是根据日期更改此内容,然后选择该日期之后的所有数据,所以我有

s.AnimalTypes.Select(t=>t.DateChanged > dateIn).ToList()
s.AnimalTypes.Sort((…

这看起来不正确,因为它没有对所选数据进行排序,而是对s.AnimalTypes中的所有内容进行排序。

有没有办法连接两条LINQ线?我试过了

s.AnimalTypes.Select(t=>t.DateChanged > dateIn).ToList().Sort((…

但是这在Sort部分给了我一个错误。

有一种简单的方法吗?我环顾四周,Grouo和OrderBy继续出现,但我不确定这些是我需要的。

由于

2 个答案:

答案 0 :(得分:1)

根据你的描述,我相信你想要的东西:

var results = s.AnimalTypes.Where(t => t.DateChanged > dateIn).OrderBy(t => t.Type);

如果需要,您可以致电ToList()以转换为List<T>

我相信你在这里缺少几个基本概念 -

首先,与List<T>.Sort不同,LINQ扩展方法不会更改原始集合,而是返回带有筛选或排序结果的新IEnumerable<T>。这意味着您总是需要为返回值指定一些内容(因此我的上面是var results =)。

其次,Select执行映射操作 - 将数据从一种形式转换为另一种形式。例如,您可以使用它来提取DateChangedSelect(t => t.DateChanged)),但这会为您提供日期的枚举,而不是原始动物类型。要使用谓词(条件)过滤或限制列表,请改用Where

最后,您可以使用OrderBy重新排序生成的可枚举项。

答案 1 :(得分:0)

当您真正想要使用Select时,您正在使用Where

Select是从一个类型的集合到另一个类型的投影 - 您不会使用Select增加或减少集合中的项目数,但您可以改为选择每个对象的名称或其他属性。

Where是用于根据布尔谓词过滤集合的内容。