使用单个LINQ语句将列表拆分为两个列表

时间:2014-03-08 02:55:00

标签: c# linq

我想用一个LINQ语句将列表拆分为两个列表。我现在正在这样做:

var listA = allItems.Where(item => item.IsUseful);
var listB = allItems.Except(listA);

但是我想在查询语法中使用一个LINQ语句,它只迭代原始列表一次,并返回一个匿名类型,其中两个列表作为属性(例如results.ListA; results.ListB)。

2 个答案:

答案 0 :(得分:7)

这会为您提供一个包含两个列表的Dictionary<bool, List<T>>,您可以使用result[true]result[false]轻松获取列表:

var result = allItems.GroupBy(item => item.IsUseful)
                     .ToDictionary(x => x.Key,x => x.ToList());

答案 1 :(得分:4)

我不知道通过像“Results.ListA”和“Result.ListB”这样的命名属性访问它而不使用反射会更加昂贵的方法,但这会让你非常接近职位:

var results = allItems.GroupBy(item => item.IsUseful).ToList();
results.First();  // this will access listA
results.Last();   // this will access listB

查询语法,就像您在问题中所说的那样:

var results = (from x in allItems
               group x by x.IsUseful
               into groupings
               select groupings).ToList(); 

results.First();  // this will access listA
results.Last();   // this will access listB