我想用一个LINQ语句将列表拆分为两个列表。我现在正在这样做:
var listA = allItems.Where(item => item.IsUseful);
var listB = allItems.Except(listA);
但是我想在查询语法中使用一个LINQ语句,它只迭代原始列表一次,并返回一个匿名类型,其中两个列表作为属性(例如results.ListA; results.ListB)。
答案 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