リストをNサイズの小さなリストに分割する [重複] 質問する

リストをNサイズの小さなリストに分割する [重複] 質問する

リストを一連の小さなリストに分割しようとしています。

問題:リストを分割する関数が、リストを正しいサイズのリストに分割しません。サイズ 30 のリストに分割するはずですが、サイズ 114 のリストに分割されます。

関数を使用して、リストをサイズが30 以下のリストの X 個に分割するにはどうすればよいですか?

public static List<List<float[]>> splitList(List <float[]> locations, int nSize=30) 
{       
    List<List<float[]>> list = new List<List<float[]>>();

    for (int i=(int)(Math.Ceiling((decimal)(locations.Count/nSize))); i>=0; i--) {
        List <float[]> subLocat = new List <float[]>(locations); 

        if (subLocat.Count >= ((i*nSize)+nSize))
            subLocat.RemoveRange(i*nSize, nSize);
        else subLocat.RemoveRange(i*nSize, subLocat.Count-(i*nSize));

        Debug.Log ("Index: "+i.ToString()+", Size: "+subLocat.Count.ToString());
        list.Add (subLocat);
    }

    return list;
}

サイズ 144 のリストでこの関数を使用すると、出力は次のようになります。

インデックス: 4、サイズ: 120
インデックス: 3、サイズ: 114
インデックス: 2、サイズ: 114
インデックス: 1、サイズ: 114
インデックス: 0、サイズ: 114

ベストアンサー1

指定されたチャンク サイズでソース リストをサブリストに分割するには、次の拡張メソッドを使用することをお勧めします。

/// <summary>
/// Helper methods for the lists.
/// </summary>
public static class ListExtensions
{
    public static List<List<T>> ChunkBy<T>(this List<T> source, int chunkSize) 
    {
        return source
            .Select((x, i) => new { Index = i, Value = x })
            .GroupBy(x => x.Index / chunkSize)
            .Select(x => x.Select(v => v.Value).ToList())
            .ToList();
    }
}

たとえば、18 項目のリストを 5 項目ずつチャンクに分割すると、5-5-5-3 という項目を含む 4 つのサブリストのリストが生成されます。

注:今後の改善LINQ.NET 6チャンキングは次のようにして実行されます。

const int PAGE_SIZE = 5;

IEnumerable<Movie[]> chunks = movies.Chunk(PAGE_SIZE);

おすすめ記事