2013-08-21 2 views
1

Может ли кто-нибудь прочитать мне следующую строку лямбда.Как читать это выражение лямбда

n => n % 2 == 1 

Также, если мне нужно написать тот же кусок кода без лямбда, как бы я его написал. Это может заставить меня понять.

Другой кусок кода ниже

List<int> numbers = new List<int>{11,37,52}; 
List<int> oddNumbers = numbers.where(n => n % 2 == 1).ToList(); 
+0

Не знаю, что язык, но выглядит как лямбда, который принимает п и возвращает истину, если она не делится на 2 – aaronman

+0

это должно быть простой операцией по модулю, который возвращает нечетные числа – Marco

+0

@aaronman проверьте теги на вопросе. Это C#. Проверьте своего зрительного сына. – Gusdor

ответ

1

эта функция

n => n % 2 == 1 

принимает один аргумент (п) и возвращают логическое значение:

  • верно, если п нечетно: n% 2 == 1 (n нечетно тогда и только тогда, когда оно имеет остаток 1 при делении на 2)
  • ложь в противном случае (если п четно)

При переписана в виде обычной функции, было бы эквивалентно

Boolean IsOdd(int n) { -- <- I've named it "IsOdd" since lambda functions have no explict names while ordinary functions have 
    return n % 2 == 1; 
    } 

Ваш код ниже

List<int> oddNumbers = numbers.where(n => n % 2 == 1).ToList(); 

я это выражение LINQ, который выбирает нечетные значения из списка

+1

To nitpick: он возвращает true, если 'n' нечетно * и положительный *. – Henrik

4

Чтение выражения вслух будет

n 'goes to' n modulus two equals one 
n  => n %  2 == 1 

По существу, вы можете думать об этой лямбда как функции, которая возвращает значение true, когда предоставленное ему значение (n) является нечетным и положительным, в противном случае - ложным. Вы также можете написать это как метод

bool IsOddAndPositive(int n) 
{ 
    return n % 2 == 1; 
} 

С его помощью, как в вашем фрагменте кода будет

List<int> numbers = new List<int>{11, 37, 52}; 
List<int> oddNumbers = numbers.Where(IsOddAndPositive).ToList(); 

И результат (обоих, что вы указали и на примере метода) является

11, 37 
0

что касается youer проблемы, как бы вы написать его без лямбда:

int[] digits = {1,2,3,4,5,6,7,8,9,10}; 
int[] OddDigits = new int[5]; 

for(int i = 0; i < digits.Length; i++) 
{ 
    if(digits[i] % 2 == 1) 
    { 
     int x = 0; 
    OddDigits[x] = digits[i]; 
     x++; 
    } 
} 

Я просто заменил список массивами для простоты. Как я уже говорил в моем комментарии выше, это простая операция по модулю

0

Line 1 конкретизирует список 3 целых оператору%, также называемый оператором по модулю вычисляет остаток от деления своего первого операнда на своем втором

результаты второй линии будет список, содержащий 11 и 37.

вы могли бы написать это, как это, используя Еогеасп:

 List<int> numbers = new List<int> { 11, 37, 52 }; 
     List<int> oddNumbers = new List<int>(); 
     foreach (var num in numbers) 
     { 
      if (num % 2 == 1) 
      { 
       oddNumbers.Add(num); 
      } 
     } 

вы также можете использовать массив.ForEach, как это:

 numbers.ForEach(num => 
     { 
      if (num % 2 == 1) 
       oddNumbers.Add(num); 
     }); 
Смежные вопросы