使用LINQ将列表转换为列表列表

dan*_*ana 4 c# linq

我有一个值列表:

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方法,但没有任何想法立即浮现在脑海中.

谢谢.

Ser*_*rvy 6

这是一个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)


Ser*_*kiy 5

您可以使用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)

您也可以在这里查看来源.