C# でリストを指定されたサイズの小さなサブリストに分割する
元の splitList
関数は、リストを 30 個の要素を含む小さなリストに分割することを目的としていました。 ただし、これには欠陥があり、サブリストのサイズが一貫性のないものになってしまいました。
拡張メソッドを使用した改善されたソリューション:
より堅牢なアプローチには、C# 拡張メソッドの作成が含まれます。
<code class="language-csharp">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(); } }</code>
機能の説明:
この拡張メソッドは、リスト (source
) を指定された chunkSize
のサブリストに効率的に分割します。 LINQ を利用します:
インデックスと値のペアリング: Select((x, i) => new { Index = i, Value = x })
は、各要素のインデックスと値を含む匿名型を作成します。
チャンクによるグループ化: GroupBy(x => x.Index / chunkSize)
は、インデックスを chunkSize
で割った値に基づいて要素をグループ化します。 これにより、同じチャンク内の要素が確実にグループ化されます。
リストの作成: Select(x => x.Select(v => v.Value).ToList())
は、各グループを元の要素タイプのリストに変換します。
リストの最終リスト: ToList()
は、チャンク化されたサブリストを含む最終リストを作成します。
実際の応用:
このメソッドを使用して、locations
という名前のリストからサイズ 30 のサブリストを作成するには:
<code class="language-csharp">List<List<YourElementType>> chunkedLists = locations.ChunkBy(30);</code>
例:
locations
に 144 個の要素が含まれる場合、chunkedLists
にはサイズ 30、30、30、30、24 の 5 つのサブリストが正しく含まれます。
今後の C# の機能強化:
.NET 6 では、この目的のために組み込みの Chunk
メソッドが導入されており、プロセスがさらに簡素化されていることに注意してください。
<code class="language-csharp">const int PAGE_SIZE = 5; IEnumerable<Movie> chunks = movies.Chunk(PAGE_SIZE);</code>
以上がC# でリストを特定のサイズのサブリストに効率的に分割するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。