2016-06-23 17 views
5

mam List<bool> i chcą bitowy XOR listy (do tworzenia bitów kontrolnych)bitowe operacja do listy <bool>

tutaj jest to, co mam obecnie

List<bool> bList = new List<bool>(){true,false,true,true,true,false,false}; 
bool bResult = bList[0]; 

for(int i = 1;i< bList.Count;i++) 
{ 
    bResult ^= bList[i]; 
} 

Q: Czy istnieje Linq jeden -liner, aby rozwiązać ten bardziej elegancki?

+0

spowoduje to wygenerowanie błędnego wyniku -> lista zaczyna się od indeksu '0', ale robisz w pętli' 1' –

+0

@ M.Schena, ponieważ 0. element jest używany jako start. –

+0

@ RenéVogt ok twoje prawa, thx –

Odpowiedz

10
bool bResult = bList.Aggregate((a, b) => a^b); 
2

Można użyć Aggregate:

bool result = bList.Aggregate((res, b) => res^b); 

Wymaga lambda dla każdego elementu z wyjątkiem pierwszego. res to wartość skumulowana (lub pierwszy element ) i b aktualną wartość z listy.

0
  List<bool> bList = new List<bool>() { true, false, true, true, true, false, false }; 
     bool bResult = bList[0]; 

     //for (int i = 1; i < bList.Count; i++) 
     //{ 
     // bResult ^= bList[i]; 
     //} 
     bList.ForEach(t=>bResult ^= t); 
+2

To by xor pierwszy element dwa razy, prowadząc do innego wyniku niż w pytaniu. (i btw: Lista .Autor nie jest częścią Linq). –

+0

ta odpowiedź daje nieprawidłowy wynik –

6

Innym rozwiązaniem jedna linia (oprócz Bug Bug „s jeden):

bool bResult = bList.Count(a => a) % 2 == 1; 

kiedy xor sekwencja bool rzeczywiście chcesz powrócić true jeśli istnieje nieparzysta liczba true s w sekwencji

+2

@berkser: Tak 'Aggregate' jest dużo łatwiejszy do odczytania, ale' Count' jeśli często jest przydatny, gdy nie masz odpowiednika 'Aggregate', np. w SQL –

+0

Zgadzam się, dziękuję za tę odpowiedź !! –