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

cyr*_*rus 2 c# linq

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

var listA = allItems.Where(item => item.IsUseful);
var listB = allItems.Except(listA);
Run Code Online (Sandbox Code Playgroud)

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

Sel*_*enç 7

这会给你一个Dictionary<bool, List<T>>带有两个列表,你可以轻松地得到您的列表result[true]result[false]:

var result = allItems.GroupBy(item => item.IsUseful)
                     .ToDictionary(x => x.Key,x => x.ToList());
Run Code Online (Sandbox Code Playgroud)


Jas*_*ell 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
Run Code Online (Sandbox Code Playgroud)

或者在查询语法中,正如您在问题中所述:

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
Run Code Online (Sandbox Code Playgroud)

  • 这些群体是否存在某种有保证的内在秩序?(即“results = {GroupTrue, GroupFalse}”,其中“GroupTrue”是包含满足条件“.IsUseful”的元素的组)。 (2认同)