.net 使用LINQ在标记元素处拆分列表?
我有一个混合了“常规”元素和“标记”元素的列表。我想把它分成一个列表,在标记处断开 e、 给定一个输入{a,b,M,c,d,e,f,M,g},其中'M'是一个标记元素,我想得到{{a,b},{c,d,e,f},{g} 使用循环来完成这项工作很容易,但似乎应该可以用LINQ更简洁地表达它,在费了一点脑筋之后,我就不知道该怎么做了。我想林克福不够。嗯.net 使用LINQ在标记元素处拆分列表?,.net,linq,list,.net,Linq,List,我有一个混合了“常规”元素和“标记”元素的列表。我想把它分成一个列表,在标记处断开 e、 给定一个输入{a,b,M,c,d,e,f,M,g},其中'M'是一个标记元素,我想得到{{a,b},{c,d,e,f},{g} 使用循环来完成这项工作很容易,但似乎应该可以用LINQ更简洁地表达它,在费了一点脑筋之后,我就不知道该怎么做了。我想林克福不够。嗯 varSplitList = myList.Aggregate(new List<List<T>>{new List<T
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中的阶乘计算器:
长事实=可枚举。范围1,n.Aggregate1,f,n=>f*n
可枚举。范围生成从1到n的整数范围。聚合函数以1开始,对于每个元素,将种子乘以元素:
1*1=1
1*2=2
2*3=6
6*4=24
24*5=120
最后,在执行所有计算之后,fact将被赋予种子的值。对于LINQ来说似乎不是一项工作。但是如果我写它而不在LINQ衣服上写一个循环,我会这样做:
var list = new List<char> {'a', 'b', 'M', 'c', 'd', 'e', 'f', 'M', 'g'};
const char marker = 'M';
var markerIndexes = list.Select((c, i) => new { c, i }).Where(z => z.c == marker).Select(z => z.i);
var split = from z in list.Select((c, i) => new { c, i })
where z.c != marker
group z.c by markerIndexes.Count(mi => z.i > mi) into g
select g.ToList();
return split.ToList();
我会给你一个风格点和一个向上的投票,但我要说的是,这显然并不比等效的循环实现更紧凑-它几乎只是LINQ服装中的循环。非常正确。。。实际上所有LINQ方法中的一种。说真的,LINQ是一个迭代器隐藏库。相当巧妙,但也很矛盾?有点可怕。当然,与普通的循环实现相比,理解起来要困难得多,也就不那么简洁了。从目前为止的答案来看,你似乎是对的——似乎不是LINQ的工作。不过,通过研究答案,我学到了一些东西——谢谢。