我有两个数组:
bool[] oldValues = GetCurrentValuesFromSomewhere ();
ChangeCurrentValues ();
bool[] newValues = GetCurrentValuesFromSomewhere ();
List<int> whichIndexsHasBeenChangedFromFalseToTrue = /* linq */
有什么想法吗? 1}}也可以是bool[]
数组而不是列表。
答案 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的改变。
编辑:修正了一个严重的问题。