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
将正确包含 5 个大小为:30、30、30、30 和 24 的子列表。
未来 C# 增强:
请注意,.NET 6 为此引入了内置的 Chunk
方法,进一步简化了流程:
<code class="language-csharp">const int PAGE_SIZE = 5; IEnumerable<Movie> chunks = movies.Chunk(PAGE_SIZE);</code>
以上是在 C# 中如何有效地将列表分成特定大小的子列表?的详细内容。更多信息请关注PHP中文网其他相关文章!