2013-11-15 58 views
1

我有兩個數組:查找布爾數組中的索引從false更改爲true?

bool[] oldValues = GetCurrentValuesFromSomewhere(); 

ChangeCurrentValues(); 

bool[] newValues = GetCurrentValuesFromSomewhere(); 

List<int> whichIndexsHasBeenChangedFromFalseToTrue = /* linq */ 

任何想法?而不是列表,它也可以是bool[]陣列。

回答

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(); 
+0

我會在一分鐘內測試它。但是,它應該是長度-1範圍? – zgnilec

+1

@zgnilec不,第二個參數是要返回的整數的數量,而不是返回的最大整數。例如。 'Enumerable.Range(0,5)'返回0,1,2,3,4。 –

+1

如果可能它們的大小不一樣,你可以到'Math.Min(oldValues.Length,newValues.Length)',但這可能不是問題。 – Servy

0

如果總是有相同數量的新與舊,而你只是在做一個diff,這是你彷彿在做,我會做這樣的事情:

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

這只是爲了改變,但如果你特意要虛假爲真,那只是對if的改變。

編輯:修正了一個嚴重的問題。

2

我寧願使用,讓你的指數在lambda,所以你不必產生範圍:

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

這應返回已更改的索引列表; .Count()會給你多少值已經改變。

UPDATE:另一種版本

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值的值。我自己學習LINQ,所以我喜歡玩這個遊戲。

+0

是的,我的答案最終超出了理智的膨脹。這是好得多。 – Magus

+0

這只是檢測變化(不關心從'假'到'真'或'真'到'假')。雖然OP的問題需要從'false'變爲'true'(儘管看起來所有舊值都是'false')。 –

+0

@KingKing我在更新答案,而你在寫你的評論,現在檢查它。 – SJuan76

相關問題