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

eua*_*njt 4 c# linq

如果我有一个布尔列表,我如何转换成一个IEnnumerable<int>整数列表(或任何其他整数),其中每个整数代表使用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}

Rob*_*Kee 7

像这样的东西:

public static class IEnumerableExt
{
    public static IEnumerable<int> ConsecutiveTrues(this IEnumerable<bool> 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用像:

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

使用纯LINQ方式(主要来自/sf/answers/1930198651/):

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());
Run Code Online (Sandbox Code Playgroud)