簡體   English   中英

如何在C#中根據索引拆分列表?

[英]How do I split a list based on index in C#?

我現在有一個包含大約190個元素的列表。 如何將列表拆分為每個列表中最多包含50個元素的較小列表?

結果可能是50,50,50和40個元素的列表。

假設您的意思是List<T> ,您可以重復使用GetRange方法。 哎呀,你可以用LINQ做到這一點:

var lists = Enumerable.Range(0, (list.Count + size - 1) / size)
      .Select(index => list.GetRange(index * size,
                                     Math.Min(size, list.Count - index * size)))
      .ToList();

或者你可以只使用一個循環,當然:

public static List<List<T>> Split(List<T> source, int size)
{
    // TODO: Prepopulate with the right capacity
    List<List<T>> ret = new List<List<T>>();
    for (int i = 0; i < source.Count; i += size)
    {
        ret.Add(source.GetRange(i, Math.Min(size, source.Count - i)));
    }
    return ret;
}

這比使用GroupBy更有效,盡管它僅限於List<T>作為輸入。

我們必須使用另一個實現IEnumerable<T>MoreLINQBatch.cs

您可以使用LINQ:

var list = Enumerable.Range(1, 190);
var sublists = list
    .Select((x, i) => new { Index = i, Value = x })
    .GroupBy(x => x.Index / 50)
    .Select(x => x.Select(v => v.Value).ToList())
    .ToArray();

我嘗試過遞歸方法。 只是為了看看它會是什么樣子。

List<List<T>> SplitIntoChunks<T>(IEnumerable<T> originalList, int chunkSize)
{
    if(originalList.Take(1).Count() == 0)
    {
        return new List<List<T>>();
    }

    var chunks = new List<List<T>> {originalList.Take(chunkSize).ToList()};
    chunks.AddRange(SplitIntoChunks(originalList.Skip(chunkSize), chunkSize));
    return chunks;
}
var list = new List<int>(Enumerable.Range(1,190));
var page_size = 50;
var max_pages = 1 + list.Count() / page_size;

for(int page = 1; page <= max_pages; page++) {
  var chunk = list.Skip(page_size * (page-1)).Take(page_size);
  // do whatever
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM