查找bool数组中的索引从false更改为true?

时间:2013-11-15 16:07:17

标签: c# .net arrays linq boolean

我有两个数组:

bool[] oldValues = GetCurrentValuesFromSomewhere ();

ChangeCurrentValues ();

bool[] newValues = GetCurrentValuesFromSomewhere ();

List<int> whichIndexsHasBeenChangedFromFalseToTrue = /* linq */

有什么想法吗? bool[]数组而不是列表。

3 个答案:

答案 0 :(得分:7)

你可以使用这样的东西:

var changedValues =
    (from i in Enumerable.Range(0, oldValues.Length)
     where !oldValues[i] && newValues[i]
     select i)
    .ToList();

或者如果您更喜欢流利的语法:

var changedValues = Enumerable
     .Range(0, oldValues.Length)
     .Where(i => !oldValues[i] && newValues[i])
     .ToList();

如果您想要bool[]结果,可以使用:

var changedValues =
    (from i in Enumerable.Range(0, oldValues.Length)
     select !oldValues[i] && newValues[i])
    .ToArray();

或者用流利的语法:

var changedValues = Enumerable
     .Range(0, oldValues.Length)
     .Select(i => !oldValues[i] && newValues[i])
     .ToArray();

答案 1 :(得分:2)

我更喜欢使用为您提供索引的lambda,因此您不必生成范围:

 var changed = newValues.
     Select((value, index) => oldValues[index] == value ? -1 : index).
     Where(i => i >= 0);

这应该返回已更改的索引列表; .Count()将为您提供已更改的值。

更新:替代版本

 var changed = newValues.
     Select((value, index) => 
        value ? (oldValues[index] ? 0 : index + 1) : (oldValues[index] ? - (index + 1) : 0)).
     Where(i => i != 0);

index+1那些false并且现在为true的值和-(index + 1) true那些false现在为{{1}}的值{1}}。我自己在学习LINQ,所以我喜欢玩它很多。

答案 2 :(得分:0)

如果总是有相同数量的新旧,并且你只是做差异,这就是你似乎在做的事情,我会做这样的事情:

int index;
whichIndexsHasBeenChangedFromFalseToTrue = oldValues.Zip(newValues, (old, new) => 
  {
    int result = -1;
    if(old != new) result = index;
    index++;
    return result;
  }).Where(x => x != -1);

这只是为了改变,但如果你特别想要false为true,那只是对if的改变。

编辑:修正了一个严重的问题。