我有一个 List<T>
这是“常规”元素和“标记”元素的混合体。我想把它分成 List<List<T>>
, 在标记处损坏。
例如给定 {a, b, M, c, d, e, f, M, g} 的输入,其中 'M' 是标记元素,我想得到 {{a, b},{c, d, e , f}, {g}}
用循环很容易完成这项工作,但似乎应该可以用 LINQ 更紧凑地表达它,但经过一番摸不着头脑之后,我就是不知道如何做。 (我猜 LINQ-fu 还不够。)
最佳答案
嗯...
varSplitList = myList.Aggregate(new List<List<T>>{new List<T>()},
(sl,t)=> {
if(/*T is a marker element*/) sl.Add(new List<T>());
else sl.Last().Add(t);
return sl;
});
可能有一种更易读的方法,但那应该可行。聚合是一种非常强大的“系列计算”方法,对这类事情很有用。您为它提供一个“种子”(在本例中是一个新的列表列表和一个子列表),并为源中的每个元素执行操作,该操作获取种子和当前元素并返回(可能已修改)种子,然后传递给下一个元素的操作。
作为一个更简单的示例,这是 Linq 中的阶乘计算器:
long fact = Enumerable.Range(1,n).Aggregate(1, (f,n)=>f*n));
Enumerable.Range() 生成从 1 到 n 的整数范围。聚合函数从 1 开始,对于每个元素,将种子乘以元素:
1*1=1 1*2=2 2*3=6 6*4=24 24*5=120...
最后,fact
在执行所有计算后被赋予种子值。
关于.net - 使用 LINQ 在标记元素处拆分列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3772895/