如果我有一个布尔列表,我如何转换成一个IEnnumerable
整数列表(或任何其他整数),其中每个整数代表使用LINQ的每个布尔字符串的长度?
例如{true, true, false, false, true, true, true}
将成为{2, 3}
作为第一次运行true
s为2长,并且第二个是3长.或者我必须回去和foreach循环?
我对错误值的数量不感兴趣,它们只是重要的,因为它们分隔了真值的运行.
所以{true, true, true, false, true, true, true, true, false, false, true, true, true}
会成为{3, 4, 3}
像这样的东西:
public static class IEnumerableExt { public static IEnumerableConsecutiveTrues(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());