【问题标题】:Using Linq to get groups from a collection使用 Linq 从集合中获取组
【发布时间】:2010-12-11 05:34:31
【问题描述】:

我的 C# 程序中有 55 个字符串值的集合。 我想从这个集合中得到每个有 20 个(或更少)项目的组。

也就是说,我将有 3 个组,分别包含 20、20 和 15 个项目。 然后对于每个组,我需要调用一个方法。

我如何使用 Linq 实现这一点?

谢谢。

【问题讨论】:

    标签: c# linq


    【解决方案1】:
    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】:

      你可以像这样构建一个扩展方法。请注意,我没有错误处理 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
      

      【讨论】:

      • 这不会导致为每个页面创建一个新的 IEnumerator 吗?似乎相当低效,无论如何只是一个很小的固定数组。
      猜你喜欢
      • 2021-05-31
      • 2021-08-20
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      相关资源
      最近更新 更多