2013-05-17 24 views
6

LINQを使用して各リストの最大アイテムに従ってリストをサブリストに分割する方法の例がたくさんあります。しかし、この場合、私は重量としてsizembを使ってサブリストをダイビングすることに興味があります - リスト当たり最大ファイルサイズは9MBです。LINQ:リストを重み/サイズに応じてグループに分割する

public class doc 
    { 
     public string file; 
     public int sizemb; 
    } 

    var list = new List<doc>() 
    { 
     new doc { file = "dok1", sizemb = 5 }, 
     new doc { file = "dok2", sizemb = 5 }, 
     new doc { file = "dok3", sizemb = 5 }, 
     new doc { file = "dok4", sizemb = 4 }, 
    }; 

    int maxTotalFileSize = 9; 

上記のリストは3つのリストに分けられます。 'ファイル'が9MBを超える場合は、自分のリストに入れる必要があります。

 var lists = new List<List<doc>>(); 
     foreach (var item in list) 
     { 
      //Try and place the document into a sub-list 
      var availableSlot = lists.FirstOrDefault(p => (p.Sum(x => x.sizemb) + item.sizemb) < maxGroupSize); 
      if (availableSlot == null) 
       lists.Add(new List<doc>() { item }); 
      else 
       availableSlot.Add(item); 
     } 
+0

は、なぜそれがあなたがDOC3とdoc4とDOC2とリストとDOC1、リストのリストを達成したい –

+0

のみ2つのユニークな値があります3つのリストでなければなりませんか? –

+1

期待される結果は何ですか? –

答えて

7

デモ:http://ideone.com/OkXw7C

dok1 
dok2 
dok3,dok4 
+0

+1の ')'の代わりに '}'だったと思います。パフォーマンスの問題が発生した場合はSum演算子をローカルのsum変数に置き換えることができます(どうして最初の答えを削除しましたか? –

+0

私はこの高速応答に感心していますが、上記はLINQ – bluee

+0

@ vc74を実際に利用していません。バグがあったので一時的に削除しました。ループの後に '... lists.Add(list);'を追加しました。 –

0

は、あなたがそれを行うには集計関数を使用することができます開始する際の任意の条件に基づいていない値を比較するとき、別にグループにのみ機能します:

は、私はここで非LINQ-バージョンを作りました

IEnumerable<IList<doc>> SplitDocumentList(IEnumerable<doc> allDocuments, int maxMB) 
{ 
    var lists = new List<IList<doc>>(); 
    var list = new List<doc>(); 
    foreach (doc document in allDocuments) 
    { 
     int totalMB = list.Sum(d => d.sizemb) + document.sizemb; 
     if (totalMB > maxMB) 
     { 
      lists.Add(list); 
      list = new List<doc>(); 
     } 
     list.Add(document); 
    } 
    if (list.Count > 0) 
     lists.Add(list); 
    return lists; 
} 

ここにあります:あなたは、このメソッドを使用することができ、新しいグループ

list.Aggregate(new List<List<doc>>(), (acc,d) => { 
      if(acc.last().Sum(x => x.sizemb) + d.sizemb > 9) { 
       acc.Add(new List<doc>()); 
      } 
      acc.last().Add(d); 
      return acc; 
    } 
) 
+1

私はこれをコンパイルすることができません.. – bluee

+0

@blueeあなたが私にエラーを教えたら私は問題を解決することができますが、一般的な考え方は同じだろう。最後に –

関連する問題