2010-12-10 98 views
2

我在C#程序中收集了55个字符串值。 我想要得到每个有20个(或更少)这个集合的物品的组。使用Linq从集合中获取组

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

我如何使用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是CREA为每个页面?似乎效率不高,无论如何,只是一个小小的固定阵列。 – Ken 2010-12-10 21:21:26

+0

@Ken:是的,我已经解决了这个问题。请参阅我的编辑。 – jason 2010-12-10 21:34:44