亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

怎么使用LINQ將集合拆分為‘N’部件?

怎么使用LINQ將集合拆分為‘N’部件?

C#
LEATH 2019-10-20 12:08:33
使用LINQ將集合拆分為‘N’部件?有什么好辦法把一個集合分割成n和LINQ的零件?當然也不一定均衡。也就是說,我想將集合劃分為子集合,每個子集合都包含元素的子集,其中最后一個集合可以是粗糙的。
查看完整描述

3 回答

?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

純Linq和最簡單的解決方案如下所示。

static class LinqExtensions{
    public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> list, int parts)
    {
        int i = 0;
        var splits = from item in list
                     group item by i++ % parts into part                     select part.AsEnumerable();
        return splits;
    }}



查看完整回答
反對 回復 2019-10-21
?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

好的,我把我的帽子扔進戒指。我的算法的優點是:

  1. 沒有昂貴的乘法、除法或模運算符
  2. 所有操作均為O(1)(見下文注)
  3. 為IEnumerable<>源代碼工作(不需要計數屬性)
  4. 簡約

守則:

public static IEnumerable<IEnumerable<T>>
  Section<T>(this IEnumerable<T> source, int length){
  if (length <= 0)
    throw new ArgumentOutOfRangeException("length");

  var section = new List<T>(length);

  foreach (var item in source)
  {
    section.Add(item);

    if (section.Count == length)
    {
      yield return section.AsReadOnly();
      section = new List<T>(length);
    }
  }

  if (section.Count > 0)
    yield return section.AsReadOnly();}

正如在下面的評論中所指出的,這種方法實際上并沒有解決最初的問題,即要求固定數量的大致相同長度的部分。盡管如此,你仍然可以用我的方法來解決原來的問題,你可以這樣稱呼它:

myEnum.Section(myEnum.Count() / number_of_sections + 1)

當以這種方式使用時,該方法不再是O(1),因為count()操作是O(N)。



查看完整回答
反對 回復 2019-10-21
  • 3 回答
  • 0 關注
  • 441 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號