如果我有一个布尔列表,我如何转换成一个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}
像这样的东西:
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)