我有一个值列表:
IList<V> values = { V1, V2, V3, V4, V5, V6, V7 };
Run Code Online (Sandbox Code Playgroud)
我想将列表转换为列表列表,其中每个子列表都是指定的大小.每个子列表的大小可能会有所不同.例如:
IList<IList<V>> values_size2 = { { V1, V2 }, { V3, V4 }, { V5, V6 }, { V7 } };
IList<IList<V>> values_size3 = { { V1, V2, V3 }, { V4, V5, V6 }, { V7 } };
IList<IList<V>> values_size4 = { { V1, V2, V3, V4 }, { V5, V6, V7 } };
Run Code Online (Sandbox Code Playgroud)
我可以使用嵌套循环很容易地做到这一点,但是想知道是否有一种聪明的方法来使用LINQ做到这一点?
我最初的想法是以某种方式使用Aggregate方法,但没有任何想法立即浮现在脑海中.
谢谢.
这是一个IEnumerable基于通用的Batch函数.你可以从改变返回类型IEnumerable<IEnumerable<T>>来IEnumerable<IList<T>>没有其他变化(因为我在执行它已经是一个列表.要改变整个事情回到你需要或者调用`ToList的结果,或者做一个列表的列表更多涉及重构.
请注意,从技术上讲,这不是使用LINQ,它只是创建一个使用LINQ常用的相同样式和模式的新方法.
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source
, int batchSize)
{
//TODO validate parameters
List<T> buffer = new List<T>();
foreach (T item in source)
{
buffer.Add(item);
if (buffer.Count >= batchSize)
{
yield return buffer;
buffer = new List<T>();
}
}
if (buffer.Count >= 0)
{
yield return buffer;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用MoreLINQ Batch扩展(可从Nuget获得):
IList<IList<V>> values_size2 = values.Batch(2);
IList<IList<V>> values_size3 = values.Batch(3);
IList<IList<V>> values_size4 = values.Batch(4);
Run Code Online (Sandbox Code Playgroud)
您也可以在这里查看来源.
| 归档时间: |
|
| 查看次数: |
1263 次 |
| 最近记录: |