В .Net 2.0: Как я могу сформировать предикат делегата для Find () что-то в моем списке <T>? - PullRequest
2 голосов
/ 21 сентября 2011

После просмотра MSDN мне все еще неясно, как мне сформировать правильный предикат для использования метода Find () в List, используя переменную-член T (где T - класс) Например:

public class Name
{
    public string FirstName;
    public string LastName;
    public String Address;
    public string Designation;
}

String[] input = new string[] { "VinishGeorge", "PonKumar", "MuthuKumar" };
//ConCatenation of FirstName and Lastname

List<Name> lstName = new List<Name>();

Name objName = new Name();
// Find the first of each Name whose FirstName and LastName will be equal to input(String array declard above).

for(int i =0;i<lstName.Count;i++)
{
    objName = lstName .Find(byComparison(x));
    Console.Writeline(objName .Address + objName.Designation);
}

Как должен выглядеть мой byComparison предикат?

1 Ответ

4 голосов
/ 21 сентября 2011

Непонятно, почему вы зацикливаете и на Find.Обычно вы будете звонить Find , а не в цикле - это будет цикл для вас.Анонимные методы - ваши друзья здесь:

Name found = lstName.Find(delegate(Name name) {
                              return name.FirstName + name.LastName == x;
                          });

Если вы используете C # 3 (даже для .NET 2), вы можете использовать вместо этого лямбда-выражение:

Name found = lstName.Find(name => name.FirstName + name.LastName == x);

РЕДАКТИРОВАТЬ:Чтобы найти все имена в input, вы можете использовать:

List<Name> matches = lstName.FindAll(delegate(Name name) {
                               string combined = name.FirstName + name.LastName;
                               return input.Contains(combined);
                           });

Обратите внимание, что это будет не очень эффективно, так как будет просматриваться весь input на совпадение на каждый Name.Однако более эффективные альтернативы являются более сложными - я думаю, что для вас важно понять, как этот код работает с самого начала.

...