如何对集合中连续的相似项目进行分组? [英] How to group consecutive similar items of a collection?

查看:92
本文介绍了如何对集合中连续的相似项目进行分组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请考虑以下集合.

  • 错误
  • 错误
  • 错误
  • 错误
  • 错误

我想以结构化的方式显示它,例如,以TreeView形式显示.我希望能够在整个组等周围绘制边框.

I want to display it in a structured way, say, in a TreeView. I want to be able to draw borders around entire groups and such.

  • 真实小组
    • True Group
      • True
      • 错误
      • 错误
      • 错误
      • 错误
      • 错误

      如何用尽可能少的过程代码来完成此操作?

      How do I accomplish this with as little procedural code as possible?

      推荐答案

      这可以满足您的需求,并且通用:

      This does what you're looking for and is generic:

      private static IEnumerable<IGrouping<int, T>> GroupConsecutive<T>(this IEnumerable<T> set, Func<T, T, bool> predicate)
      {
          var i = 0;
          var k = 0;
          var ranges = from e in set
                       let idx = ++i
                       let next = set.ElementAtOrDefault(idx)
                       let key = (predicate(e, next)) ? k : k++
                       group e by key into g
                       select g;
          return ranges;
      }
      

      用法:

      var set = new List<bool>
                  {
                      true,
                      false,
                      false,
                      false,
                      true,
                      true,
                      false,
                      false,
                  };
      var groups = set.GroupConsecutive((b1, b2) => (b1 == b2));
      foreach (var g in groups)
      {
          Console.WriteLine(g.Key);
          foreach (var b in g)
              Console.WriteLine("\t{0}", b);
      }
      

      输出:

      0
              True
      1
              False
              False
              False
      2
              True
              True
      3
              False
              False
      

      这篇关于如何对集合中连续的相似项目进行分组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆