Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用LINQ在标记元素处拆分列表?_.net_Linq_List - Fatal编程技术网

.net 使用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

我有一个混合了“常规”元素和“标记”元素的列表。我想把它分成一个列表,在标记处断开

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>()}, 
   (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的工作。不过,通过研究答案,我学到了一些东西——谢谢。