2013-11-17 3 views
1

У меня есть выражение лямбда, в котором необходимо назначить локальную переменную, чтобы избежать вызова моего RetrieveAge (Datetime birthDate) два раза за каждый набор результатов.Назначение локальной переменной в выражении лямбда

Мой лямбда-выражение выглядит следующим образом:

result = myList.AsEnumerable().Where(f => DateHelper.RetrieveAge(f.Birthdate) >= 20 && DateHelper.RetrieveAge(f.Birthdate) <= 40).Select(x => new Person { Name = x.Name, Id = x.Id, Alias = x.Alias }).ToList(); 

Я пытаюсь добиться чего-то вроде следующего:

var result = myList.AsEnumerable().Where(f => { var age = DateHelper.RetrieveAge(f.Birthdate); age >= 20 && age <= 40 }).Select(x => new Person { Name = x.Name, Id = x.Id, Alias = x.Alias }).ToList(); 

Но я не могу понять, как сделать это правильно. Любые намеки или предложения будут в основном оценены.

+0

возможно дубликат [C#: Можно ли объявить локальную переменную в анонимный метод?] (http://stackoverflow.com/questions/369334/c-is-it-possible-to-declare-a-local-variable-in-an-anonymous-method) – oefe

ответ

4

Вы почти там - вам нужно добавить return и точкой с запятой:

var result = myList 
    .AsEnumerable() 
    .Where(f => { 
     var age = DateHelper.RetrieveAge(f.Birthdate); 
     return age >= 20 && age <= 40; // <<== Here 
    }).Select(x => new Person { 
     Name = x.Name, Id = x.Id, Alias = x.Alias } 
    ).ToList(); 
+0

Я действительно положил точку с запятой по одной из моих попыток, но я пропустил ключевое слово return. Это крутой трюк, чтобы знать о назначении локальных переменных, которые будут использоваться через остаток выражения лямбда. :) – codingjoe

0
var result = myList.AsEnumerable() 
    .Select(f => new { F = f, X = DateHelper.RetrieveAge(f.Birthdate)) 
    .Where(f => f.F.age >= 20 && f.F.age <= 40 }) 
    .Select(x => new Person { Name = f.F.Name, Id = f.F.Id, Alias = f.F.Alias }) 
    .ToList(); 
1
var result = (from f in myList.AsEnumerable() 
      let age = DateHelper.RetrieveAge(f.Birthdate) 
      where age >= 20 && age <= 40 
      select new Person { Name = f.Name, Id = f.Id, Alias = f.Alias }).ToList(); 
0
var result = myList.AsEnumerable().Where(f => 
{ 
    var age = DateHelper.RetrieveAge(f.Birthdate); 
    return age >= 20 && age <= 40 
}).Select(x => new Person { Name = x.Name, Id = x.Id, Alias = x.Alias }).ToList(); 
Смежные вопросы