使用LINQ将集合拆分为‘N’部件?

使用LINQ将集合拆分为‘N’部件?

有什么好办法把一个集合分割成n和LINQ的零件?当然也不一定均衡。

也就是说,我想将集合划分为子集合,每个子集合都包含元素的子集,其中最后一个集合可以是粗糙的。


ABOUTYOU
浏览 361回答 3
3回答

婷婷同学_

纯Linq和最简单的解决方案如下所示。static&nbsp;class&nbsp;LinqExtensions{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;IEnumerable<IEnumerable<T>>&nbsp;Split<T>(this&nbsp;IEnumerable<T>&nbsp;list,&nbsp;int&nbsp;parts) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;splits&nbsp;=&nbsp;from&nbsp;item&nbsp;in&nbsp;list &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;group&nbsp;item&nbsp;by&nbsp;i++&nbsp;%&nbsp;parts&nbsp;into&nbsp;part&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;part.AsEnumerable(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;splits; &nbsp;&nbsp;&nbsp;&nbsp;}}

临摹微笑

好的,我把我的帽子扔进戒指。我的算法的优点是:没有昂贵的乘法、除法或模运算符所有操作均为O(1)(见下文注)为IEnumerable<>源代码工作(不需要计数属性)简约守则:public&nbsp;static&nbsp;IEnumerable<IEnumerable<T>> &nbsp;&nbsp;Section<T>(this&nbsp;IEnumerable<T>&nbsp;source,&nbsp;int&nbsp;length){ &nbsp;&nbsp;if&nbsp;(length&nbsp;<=&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ArgumentOutOfRangeException("length"); &nbsp;&nbsp;var&nbsp;section&nbsp;=&nbsp;new&nbsp;List<T>(length); &nbsp;&nbsp;foreach&nbsp;(var&nbsp;item&nbsp;in&nbsp;source) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;section.Add(item); &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(section.Count&nbsp;==&nbsp;length) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;return&nbsp;section.AsReadOnly(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;section&nbsp;=&nbsp;new&nbsp;List<T>(length); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;if&nbsp;(section.Count&nbsp;>&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;return&nbsp;section.AsReadOnly();}正如在下面的评论中所指出的,这种方法实际上并没有解决最初的问题,即要求固定数量的大致相同长度的部分。尽管如此,你仍然可以用我的方法来解决原来的问题,你可以这样称呼它:myEnum.Section(myEnum.Count()&nbsp;/&nbsp;number_of_sections&nbsp;+&nbsp;1)当以这种方式使用时,该方法不再是O(1),因为count()操作是O(N)。
打开App,查看更多内容
随时随地看视频慕课网APP