我在加入两个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继续出现,但我不确定这些是我需要的。
由于
答案 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
执行映射操作 - 将数据从一种形式转换为另一种形式。例如,您可以使用它来提取DateChanged
(Select(t => t.DateChanged)
),但这会为您提供日期的枚举,而不是原始动物类型。要使用谓词(条件)过滤或限制列表,请改用Where
。
最后,您可以使用OrderBy
重新排序生成的可枚举项。
答案 1 :(得分:0)
当您真正想要使用Select
时,您正在使用Where
。
Select
是从一个类型的集合到另一个类型的投影 - 您不会使用Select
增加或减少集合中的项目数,但您可以改为选择每个对象的名称或其他属性。
Where
是用于根据布尔谓词过滤集合的内容。