私のC#プログラムに55文字列の値のコレクションがあります。 私はこのコレクションから20個(またはそれ以下)のアイテムを持つグループを取得したいと思います。Linqを使ってコレクションからグループを取得する
だから、20、20、15の3つのグループがあります。 各グループについて、メソッドを呼び出す必要があります。
どのように私はLinqを使ってこれを達成できますか?
ありがとうございました。
私のC#プログラムに55文字列の値のコレクションがあります。 私はこのコレクションから20個(またはそれ以下)のアイテムを持つグループを取得したいと思います。Linqを使ってコレクションからグループを取得する
だから、20、20、15の3つのグループがあります。 各グループについて、メソッドを呼び出す必要があります。
どのように私は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();
このように拡張メソッドを作成することができます。空/空の処理エラーは発生していないことに注意してください。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
が、これは新しいのIEnumeratorがクレアされることはありません各ページごとにテッド?いずれにしても、非常に効率的ではないようですが、小さな固定配列です。 – Ken
@Ken:はい、私はその懸念に取り組んできました。私の編集を見てください。 – jason