6

各リストの最大項目に応じてリストをサブリストに分割する方法について、LINQ を使用した多くの例があります。しかし、この場合、重みとしてsizembを使用してサブリストをダイビングすることに興味があります-リストごとの最大合計ファイルサイズは9mbです。

    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 つのリストに分割する必要があります。「ファイル」が 9 MB を超える場合は、独自のリストに含める必要があります。

ここで非LINQバージョンを作成しました:

        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);
        }
4

2 に答える 2

7

この方法を使用できます:

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;
}

デモはこちら: http://ideone.com/OkXw7C

dok1
dok2
dok3,dok4
于 2013-05-17T07:50:03.237 に答える
0

Aggregate関数を使用してそれを行うことができます.group byは、新しいグループをいつ開始するかという任意の条件に基づいていない値を比較する場合にのみ機能します

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;
   }
)
于 2013-05-17T07:50:01.707 に答える