2010-10-21 4 views
4

Ниже функция работает нормально, но я хочу сделать ее простой.Делегат как функция

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) ; }); 
    } 

UPDATE

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

ответ

3

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

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

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

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

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

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

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

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

+0

+1 вы били меня за 50 минут. LOL –

1

если вы на .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

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

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

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

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

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