当前位置:  开发笔记 > 编程语言 > 正文

如何将bool列表折叠为整数列表

如何解决《如何将bool列表折叠为整数列表》经验,为你挑选了1个好方法。

如果我有一个布尔列表,我如何转换成一个IEnnumerable整数列表(或任何其他整数),其中每个整数代表使用LINQ的每个布尔字符串的长度?

例如{true, true, false, false, true, true, true}将成为{2, 3}作为第一次运行trues为2长,并且第二个是3长.或者我必须回去和foreach循环?

我对错误值的数量不感兴趣,它们只是重要的,因为它们分隔了真值的运行.

所以{true, true, true, false, true, true, true, true, false, false, true, true, true}会成为{3, 4, 3}



1> Robert McKee..:

像这样的东西:

public static class IEnumerableExt
{
    public static IEnumerable ConsecutiveTrues(this IEnumerable bools)
    {
      var flag=false;
      int count=0;
      foreach(var b in bools)
      {
        if (b)
        {
          count++;
        } else if (flag)
        {
            yield return count;
            count=0;
        }
        flag=b;
      }
      if (flag)
        yield return count;
    }
}

然后使用像:

void Main()
{
  var bools=new bool[]{true, true, false, false, true, true, true};
  var results=bools.ConsecutiveTrues();
}

使用纯LINQ方式(主要来自/sf/ask/17360801/):

var str = new bool[]{true, true, true, false, true, true, true, true, false, false, true, true, true};

// Retain a horrid mutable sequence which tracks consecutive characters
var sequence = 0;
var grps = str
  .Zip((str.Concat(new bool[]{str.Last()})).Skip(1),
     (prev, current) => new { prev, current })
  .GroupBy(p => new { 
      Ch = p.prev, 
      Sequence = p.current == p.prev
      ? sequence 
      : sequence++})
  .Where(l=>l.Key.Ch==true)
  .Select(l=>l.Count());

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有