Делегировать как функцию - PullRequest
4 голосов
/ 21 октября 2010

Функция ниже работает нормально, но я хочу упростить ее.

if (list.Exists(delegate(string s) { return s.Contains(str); }))
{
    string name = list.Find(delegate(string s) { return s.Contains(str); });
}

Я использую delegate(string s) { return s.Contains(str); } два раза Есть ли способ сделать это простым.Я знаю, как создать делегата, но не знаю, как его использовать.

    //create delegate       
    public delegate bool nameExistsDelegate(List<string> list, string name);

    // Create a method for a delegate.
    public static bool IsnameExists(List<string> list, string name)
    {
        return list.Exists(delegate(string s) { return s.Contains(name) ; });
    }

    // Create a method for a delegate.
    public static string GetName(List<string> list, string name)
    {
        return list.Find(delegate(string s) { return s.Contains(name) ; });
    }

ОБНОВЛЕНИЕ

застрял в .NET 2.0, поэтому я не могу использовать LINQ

Ответы [ 3 ]

3 голосов
/ 21 октября 2010

Анонимный метод, который вы используете, будет преобразован в делегат Predicate<string> компилятором.Имея это в виду, вы можете ввести локальный код, чтобы избавиться от ненужной избыточности.

Predicate<string> containsStr = delegate(string s) { return s.Contains(str); };

if (list.Exists(containsStr))
{
   string name = list.Find(containsStr);
   ...
}

В C # 3.0 или более поздних версиях это можно выразить еще более кратко с помощью лямбда-выражений.

Predicate<string> containsStr = s => s.Contains(str);

С другой стороны, вам не нужно сначала проверять, существует ли str, а затем приступить к его поиску (при условии, что список не содержит нулей), вы можете просто сделать:

string name = list.Find(s => s.Contains(str));
if(name != null)
{
   //found
}

Конечно, я должен также отметить, что строки не содержат никаких дополнительных метаданных, кроме присутствующих в них символов, поэтому вы ничего не получите, «найдя» строку в списке надпросто доказательство его существования (если вы не имели в виду FindIndex).

1 голос
/ 21 октября 2010

если вы на .net 3.5 вы можете использовать lamdas

 //create delegate       
    public delegate bool nameExistsDelegate(List<string> list, string name);

    static Func<string, bool> exists = s =>  return s.Contains(name);

    // Create a method for a delegate.
    public static bool IsnameExists(List<string> list, string name)
    {
        return list.Exists(s => exists(s));
    }

    // Create a method for a delegate.
    public static string GetName(List<string> list, string name)
    {
        return list.Find(s => exists(s));
    }
0 голосов
/ 21 октября 2010

Я бы порекомендовал прочитать о стандартных типах делегатов в C #

Здесь на самом деле вам нужен Predicate, который принимает объект, проверяет его с некоторым условием и возвращает результат прохождения / отказа.

Predicate<string> containsCheck = item = > item.Contains(str);
if (list.Exists(containsCheck)
{
    string name = list.Find(containsCheck);
}

Примечание: весь код также может быть выполнен с использованием LINQ, что значительно проще.Но я думаю, вы должны изучать делегатов прямо сейчас .. JFYI

using System.Linq;
...
Predicate<string> substringCheck = item => item.Contains(str);
            var exists = list.Any(substringCheck);
            var getMatch = list.First(substringCheck);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...