.net - 使用 LINQ 在标记元素处拆分列表?

标签 .net linq list

我有一个 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/

相关文章:

c# - 两个 DateTimes 之间的时差?

c# - 根据时间从对象列表中选择第一个、最后一个、最小值、最大值

c# - ComboBox 的复合 DisplayMember

python - 每 20 分钟左右列出一次超出范围的索引错误

python - Python中的集合和列表有什么区别?

.net - 有人可以给我一个真实世界的例子,说明我可能想要/需要在 .NET 中使用 BitArray 类吗?

.net - 从 .NET 应用程序间接调用 CoInitializeSecurity

.net - Reactive Framework (Rx) 与 .NET 4 中的任务有什么关系?

c# - 使用 Access DB 作为数据源进行 ORM 的最佳方法

c# - 在 C# 中,如果将列表中的对象添加到另一个列表中,更改第二个列表中的对象是否会更改第一个列表中的同一对象?