2015-03-13 3 views
0

Я уже рассмотрел вопрос о SO, но не смог найти решение моей проблемы.Пропустить запрос LINQ к методу для выбора динамически сформировать коллекцию

В моей программе есть класс, единственной причиной которого является выбор из коллекции данных, переданных ему через конструктор. Что мне нужно, так это передать запрос LINQ к методу выбора для выбора из указанных данных. Однако мне не удалась решить мою проблему. Вот код:

public class ServiceClient<TInput> 
{ 
    private readonly IEnumerable<TInput> data; 

    public ServiceClient(IEnumerable<TInput> dataInput) 
    { 
     this.data = dataInput; 
    } 

    public TResult Send<TResult>(Func<IEnumerable<TInput>, TResult> selector) 
    { 
     var selectedData = this.data.Select(selector); // How to do the selection here??? 

     // ... 
    } 
} 

Класс называется так:

private static void Main(string[] args) 
{ 
    var persons = new List<Person> 
    { 
     new Person { Id = 0, FamilyId = 0 }, 
     new Person { Id = 1, FamilyId = 0 }, 
     new Person { Id = 2, FamilyId = 1 } 
    }; 

    var func = new Func<IEnumerable<Person>, Person>(Target); 

    var client = new ServiceClient<Person>(persons); 

    client.Send(func); 
} 

private static Person Target(IEnumerable<Person> enumerable) 
{ 
    return enumerable.SingleOrDefault(p => p.Id == 0); 
} 

ответ

4

Заменить:

var selectedData = this.data.Select(selector); 

с:

var selectedData = selector(this.data); 

Это должно быть достаточно. selector является делегатом, который собирает acceps и возвращает один элемент, поэтому вам нужно вызвать делегата selector с аргументом data.

Если вы хотели бы использовать Select как this.data.Select(..) ваш selector делегат должен скорее походить Func<TInput, TResult> - делегат, который проецирует один элемент в другой.

+0

Ну, это было легко. Кажется, мне нужно больше узнать о функциях любой хорошей рекомендации по этой теме? – Ruhrpottpatriot

+0

Я рекомендую вам приятную книгу: http://www.amazon.com/Programming-Microsoft%C2%AE-PRO-Developer-Paolo-Pialorsi/dp/0735624003 Я ее прочитал и нашел очень полезным. –

+0

попробует это благодаря. – Ruhrpottpatriot

0

Вам нужно изменить Отправить этот путь:

public TResult Send<TResult>(Func<IEnumerable<TInput>, TResult> selector) 
{ 
    return selector(data); 
} 
Смежные вопросы