2010-12-10 8 views
2

私のC#プログラムに55文字列の値のコレクションがあります。 私はこのコレクションから20個(またはそれ以下)のアイテムを持つグループを取得したいと思います。Linqを使ってコレクションからグループを取得する

だから、20、20、15の3つのグループがあります。 各グループについて、メソッドを呼び出す必要があります。

どのように私はLinqを使ってこれを達成できますか?

ありがとうございました。

答えて

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(); 
2

このように拡張メソッドを作成することができます。空/空の処理エラーは発生していないことに注意してください。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 
+0

が、これは新しいのIEnumeratorがクレアされることはありません各ページごとにテッド?いずれにしても、非常に効率的ではないようですが、小さな固定配列です。 – Ken

+0

@Ken:はい、私はその懸念に取り組んできました。私の編集を見てください。 – jason

関連する問題