【发布时间】:2010-12-11 05:34:31
【问题描述】:
我的 C# 程序中有 55 个字符串值的集合。 我想从这个集合中得到每个有 20 个(或更少)项目的组。
也就是说,我将有 3 个组,分别包含 20、20 和 15 个项目。 然后对于每个组,我需要调用一个方法。
我如何使用 Linq 实现这一点?
谢谢。
【问题讨论】:
我的 C# 程序中有 55 个字符串值的集合。 我想从这个集合中得到每个有 20 个(或更少)项目的组。
也就是说,我将有 3 个组,分别包含 20、20 和 15 个项目。 然后对于每个组,我需要调用一个方法。
我如何使用 Linq 实现这一点?
谢谢。
【问题讨论】:
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();
【讨论】:
你可以像这样构建一个扩展方法。请注意,我没有错误处理 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
【讨论】: