2014-09-10 2 views
0

мне нужно создать метод, который с общим Enumerable типа T он находит внутри него, используя в котором этот термин я указатьLINQ общей функции для находки в перечислимом

public static object findInList<T>(T[] list, string searchTerm, string seachIndex) 
{ 
    string normalized1 = Regex.Replace(seachIndex, @"\s", ""); 
    var sel = (from l in list 
        where normalized1.Equals([the item i want to compare]) 
        select l).FirstOrDefault(); 
    return sel ; 
} 

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

[...] 
string normalized1 = Regex.Replace(seachIndex, @"\s", ""); 
sel = (from l in list 
     where normalized1.Equals(l.Ordine) 
     select l).FirstOrDefault(); 
[...] 

[редактировать] Благодаря Servy для ответа. Для полного индекса этого ответа я добавить здесь, как назвать этот метод

Func<XXX, string> keySelector = delegate(XXX b) { return b.XX; }; 
var return = findInList<XXX>(list, keySelector, seachIndex); 

Где XXX является тип списка и XX является собственностью вы хотите сравнить для поиска

+1

Как добавить 4-й параметр, в котором вы передаете делегат? –

+0

Я не понимаю, что нужно –

ответ

2

Что вам нужно здесь для вашего метода, чтобы принять селектор, некоторые функции определяют, что вы должны сравнивать для каждого из ваших объектов.

public static T findInList<T>(
    IEnumerable<T> sequence, 
    Func<T, string> keySelector, 
    string searchTerm, 
    string seachIndex) 
{ 
    string normalized1 = Regex.Replace(seachIndex, @"\s", ""); 
    return (from l in sequence 
      where normalized1.Equals(keySelector(l)) 
      select l).FirstOrDefault(); 
} 

Вы также можете вернуть T вместо object, так как вы знаете, что это то, что это, гарантируя, что вызывающий абонент не должен бросить его обратно к тому, что она есть. Вы можете принять IEnumerable вместо массива, поскольку вы только когда-либо итерации его, тем самым предоставляя абоненту большую гибкость, позволяя делать все, что вам нужно.

+0

Как я могу назвать этот метод с помощью Func <>? Можете ли вы привести мне пример? – theLaw

+1

Передайте метод, принимающий объект типа в последовательности и возвращающий строку. Вы можете использовать лямбда, если хотите, хотя вам этого не нужно. Вы можете найти документацию для лямбда для большого количества примеров. – Servy

+0

@Servy Похоже, что OP хочет выполнить поиск и заменить. В этом случае вам нужно использовать 'Expression >', а затем преобразовать его в 'PropertyInfo', чтобы вы могли получить как' get', так и 'set' свойства, а затем вызвать' get' 'replace', затем' set'. – Aron

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