使用Linq从集合中获取组

时间:2010-12-10 21:11:56

标签: c# linq

我的C#程序中有55个字符串值的集合。 我希望每个小组都有20个(或更少)来自此系列的项目。

所以,这意味着,我将有3组20,20和15项。 然后对于每个组,我需要调用一个方法。

我如何使用Linq实现这一目标?

感谢。

2 个答案:

答案 0 :(得分:7)

List<string> strings = ...
List<List<string>> groups = strings
    .Select((s, idx) => new { Item = s, Group = idx / 20 })
    .GroupBy(s => s.Group)
    .Select(grp => grp.Select(g => g.Item).ToList())
    .ToList();

答案 1 :(得分:2)

您可以像这样构建扩展方法。请注意,我没有处理null / empty source的错误。

static class EnumerableExtensions {
    public static IEnumerable<IEnumerable<T>> GetPages<T>(
        this IEnumerable<T> source,
        int pageSize
    ) {
        var e = source.GetEnumerator();
        while(e.MoveNext()) {
            int count = pageSize - 1;
            List<T> list = new List<T>(pageSize) { e.Current };
            while (count > 0 && e.MoveNext()) {
                list.Add(e.Current);
                count--;
            }
            yield return list;
        } 
    }
}

然后:

IEnumerable<string> strings;
var pages = strings.GetPages(20)

示例:

var list = Enumerable.Range(0, 55).Select(x => x.ToString()).ToList();
foreach (var page in list.GetPages(20)) {
    Console.WriteLine(page.Count());
}

输出:

20
20
15