2010-10-21 20 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或更高版本中,您可以更加直接地用lambda表達式表達這一點。

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

在另一方面,你不需要先測試str存在,然後繼續找到它(假設列表中不包含空值),你可以只是做:

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

當然,我還應該指出,除了存在於其中的字符之外,字符串不包含任何額外的元數據,因此您不會通過在列表中找到一個字符串來獲取任何內容,而只是證明其存在(除非你的意思是FindIndex)。

+0

+1你打了我50分鐘。 – 2010-10-21 03:59:32

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

using System.Linq; 
... 
Predicate<string> substringCheck = item => item.Contains(str); 
      var exists = list.Any(substringCheck); 
      var getMatch = list.First(substringCheck);