2013-11-15 6 views
1

내가 한 두 배열 :bool 배열의 인덱스를 false에서 true로 변경 했습니까?

bool[] oldValues = GetCurrentValuesFromSomewhere(); 

ChangeCurrentValues(); 

bool[] newValues = GetCurrentValuesFromSomewhere(); 

List<int> whichIndexsHasBeenChangedFromFalseToTrue = /* linq */ 

어떤 생각? 목록 대신에 bool[] 배열도 가능합니다.

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

을 아니면 유창 구문을 선호하는 경우 :

답변

7

이 같이 사용하는 뭔가를 할 수

var changedValues = 
    (from i in Enumerable.Range(0, oldValues.Length) 
    select !oldValues[i] && newValues[i]) 
    .ToArray(); 
: 당신이 bool[] 결과를 원한다면

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

, 당신은이를 사용할 수 있습니다

또는 유창한 구문 :

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

잠시 후에 테스트 해 보겠습니다. 하지만 Range에서 Length - 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); 

을 이것은 변경된 경우에만 적용됩니다. 그러나 false를 true로 지정하려는 경우 if는 if의 변경 사항입니다.

편집 : 심각한 문제가 해결되었습니다.

2

나는 당신이 인덱스를 제공 람다를 사용하여 선호하는, 그래서 당신은 범위 생성 할 필요가 없습니다 :이 변경 인덱스의 목록을 반환해야

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

을; .Count()은 변경된 값의 수를 알려줍니다.

UPDATE : false이었고 true을했고, 지금 false입니다 지금 true-(index + 1)로 그 값이며이 값 index+1로 당신을 줄 것이다 또 다른 버전

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

. 나는 LINQ를 배우려고하는데, 나는 그걸 가지고 놀고 싶어.

+0

그래, 내 대답은 정신이 이상 bloating 끝났다. 이것은 훨씬 낫다. – Magus

+0

이것은 단지 변경 사항을 감지합니다 ('false'에서'true' 또는'true'에서'false'까지 신경 쓰지 않습니다). OP의 질문은 '거짓'에서 '참'을 요구하지만 (모든 오래된 값은 '거짓'인 것처럼 보이지만). –

+0

@KingKing 귀하의 의견을 writting하는 동안 나는 그것을 업데이 트하고 있었는데, 지금 그것을 확인하십시오. – SJuan76

관련 문제