2016-03-29 6 views
2

Я создал класс Command, который имеет два важных элемента.C# Lambda-Select с условиями

public class Command 
{ 
    public string Name { get; set; } 
    public CommandExecutedCallback Callback { get; set; } 
    public delegate void CommandExecutedCallback(Command command); 
} 

Я сохраняю несколько объектов данного класса в List<Command>.

Другой класс CommandProcessor имеет функцию-член GetCallbacks(string name).

Я хочу использовать выражение лямбда для получения массива CommandExecutedCallback -delegates с условием соответствия имени.

Я могу получить все обратные вызовы с помощью: return commandList.Select(t => t.Callback).ToArray().

Как я могу вставить условие, чтобы получить только команды с указанным именем?

Заранее спасибо.

+1

'Select' предназначен для проекции. Используйте 'Where' для фильтрации. –

ответ

4

Вы должны добавить в Where условие:

return commandList.Where(t => t.Name == name).Select(t => t.Callback); 

Вы должны также избегать вызова ToArray, если вы действительно не нужно. Если вы специально не передаете эти данные другому методу, который требует массив, копирование всех данных с помощью ToArray, вероятно, является ненужной (и довольно дорогостоящей) операцией.

+0

Это именно то, что я искал. Огромное спасибо. –

2

Это вы имеете в виду?

return commandList 
    .Where(t => t.Name == "someName") 
    .Select(t => t.Callback) 
    .ToArray(); 
+0

Кроме того, это то, что я искал. Спасибо тоже :) –

0

Вам нужно использовать ГДЕ НЕ ВЫБРАТЬ. С помощью Select вы указываете, что вы из списка, и с WHERE вы фильтруете список для показа.

return commandList.Where(t => t.Name == "VALUE").Select(t => t.Callback) 
+0

Вы уронили 'Select', который по-прежнему необходим. –

+0

Я изменил его, но я считаю его более важным, если он понимает разницу между ними. –

Смежные вопросы