2015-08-24 3 views
1

У меня есть метод, который выглядит следующим образом:Как использовать метод с выводимый параметр в лямбда-выражения

bool GetIdByName(string name, out ID id) 

Я хотел бы использовать его внутри лямбда-выражения, чтобы получить несколько «иды» ряд «имен»:

var ids = names.Select(name => idService.GetIdByName(name, out id)); 

в этом случае я буду найти все значения BOOL в моей переменной «IdS», который не то, что я хочу. Возможно ли также получить в нем параметр «id» каждого вызова?

+1

Почему вы используя параметр 'out' для' id'? Почему бы просто не вернуть сам 'id'? Существуют ли случаи, когда идентификатор отсутствует? –

+0

Существующий метод, который возвращает идентификатор, не был написан мной, и я не хочу прикасаться к нему. Да, есть случаи, когда id отсутствует. –

ответ

5

Вы можете использовать делегат с телом для этого:

IEnumerable<ID> ids = names.Select 
(
    name => 
    { 
     ID id; 
     GetName(name, out id); 

     return id; 
    } 
); 
2

Я бы включил вызов GetIdByName в метод, чтобы он стал более сложным.

var ids = names.Select(GetId); 

private static ID GetId(string name) 
{ 
    ID id; 
    idService.GetIdByName(name, out id); 
    return id; 
} 
2

Ищите что-то в этом роде?

var ids = names 
    .Select(name => { 
    ID id = null; 

    if (!idService.GetIdByName(name, out id)) 
     id = null; // name doesn't corresponds to any ID 

    return id; 
    }) 
    .Where(id => id != null); 

В случае ID является структура (и поэтому не обнуляемым):

var ids = names 
    .Select(name => { 
     ID id = null; 
     Boolean found = idService.GetIdByName(name, out id); 

     return new { 
     Found = found, 
     ID = id 
     }; 
    }) 
    .Where(data => data.Found) 
    .Select(data => data.id); 
Смежные вопросы