C# 4.0. Jak można wykonać następujące czynności za pomocą wyrażeń lambda?Wybierz co drugi element z tablicy używając lambda
int[] a = new int[8] { 0, 1, 2, 3, 4, 5, 6, 7 };
// Now fetch every second element so that we get { 0, 2, 4, 6 }
C# 4.0. Jak można wykonać następujące czynności za pomocą wyrażeń lambda?Wybierz co drugi element z tablicy używając lambda
int[] a = new int[8] { 0, 1, 2, 3, 4, 5, 6, 7 };
// Now fetch every second element so that we get { 0, 2, 4, 6 }
int[] list = a.Where((value, index) => index % 2 == 0)
.ToArray();
będzie wybrać tylko jeszcze indeksów a oblicz przez (mod) operatora %
.
5 % 2 // returns 1
4 % 2 // returns 0
Zgodnie z MSDN:
operatorReszta jest twoim przyjacielem.
int[] everySecond = a.Where((i, ind) => ind % 2 == 0).ToArray();
Operator% oblicza reszta z dzielenia pierwszy operand jego sekundę. Wszystkie typy liczbowe mają predefiniowane pozostałe operatory.
+1 dla łącza E.Lippert. – Askolein
Innym sposobem korzystania Enumerable.Range
var result = Enumerable.Range(0, a.Length/2)
.Select(i => a[2*i])
.ToArray();
lub użyj bitowego na bardziej wydajne, by sprawdzić nawet:
var result = a.Where((i, index) => (index & 1) == 0)
.ToArray();
+1 dla bitowego testu nieparzystości/parzystości, który jest o wiele bardziej wydajny niż operator "%". Tak elegancko :-) – Askolein
http://stackoverflow.com/questions/2229107/what-is-the-fastest-way-to-find-if-a-number-is-even-or-odd –
+1, zapomniałem, że ' gdzie 'ma również przeciążenie z indeksem :) –