2011-05-13 59 views
0

我有一個文件名字符串的通用列表。我只想抓住符合特定模式的值。我查找了一些關於在List中查找模式的文檔,並找到了這篇MSDN文章。在通用列表集合中搜索字符串模式

http://msdn.microsoft.com/en-us/library/x0b5b5bc%28VS.85%29.aspx#Y1440

我已經削減了一些基本的例子,在這裏列出了。

List<string> dinosaurs = new List<string>(); 

dinosaurs.Add("Compsognathus"); 
dinosaurs.Add("Amargasaurus"); 
dinosaurs.Add("Oviraptor"); 
dinosaurs.Add("Velociraptor"); 
dinosaurs.Add("Deinonychus"); 
dinosaurs.Add("Dilophosaurus"); 
dinosaurs.Add("Gallimimus"); 
dinosaurs.Add("Triceratops"); 

// Search predicate returns true if a string ends in "saurus". 
private static bool EndsWithSaurus(String s) 
{ 
    if ((s.Length > 5) && 
     (s.Substring(s.Length - 6).ToLower() == "saurus")) 
    { 
     return true; 
    }else{ 
     return false; 
    } 
} 

Bool result = dinosaurs.Find(EndsWithSaurus); 

我想我理解ONE BIG異常正在做什麼。方法EndsWithSaurus正在等待一個字符串被傳遞給它,但我沒有看到它在哪裏被裝入

+0

.NET是什麼版本的? – 2011-05-13 17:37:03

+0

對不起。我應該提到這一點。我正在使用.NET v3.5 – webworm 2011-05-13 17:38:47

回答

3

如果您使用的是.NET 3.5+(在System.Linq命名空間中使用LINQ擴展方法),你可以這樣做,這將回報你比賽的一個子集:

var results = dinosaurs.Where(d => d.EndsWith("saurus")).ToList(); 

爲了回答您的其他問題,在顯示方面的例子,首先查找(),如果它找到一個匹配的只返回真/假,但不是比賽本身。另一方面,()返回匹配的子集。我喜歡LINQ這些類型的查詢(Where()等),因爲它們可以與任何IEnumerable容器(List,HashSet,Array等)一起工作。

至於你的問題,關於如何通過字符串,Find()方法(和Where()等)採取代理Func<string, bool> - 因爲你的列表是一個字符串容器 - 它告訴它是否匹配,例如,您在該方法的名稱中顯示了通行證,並將其分配給委託。只要該方法滿足Func<string, bool>的簽名,這意味着它需要一個字符串並返回一個布爾值。

有意義嗎?

+0

謝謝你的例子! – webworm 2011-05-13 17:39:35

+0

p.s.如果你想將結果存儲在一個列表中,你可以直接枚舉ToList(),或者使用ToArray()來存儲數組等等。 。 – 2011-05-13 17:42:58

+0

感謝您的解釋。 Find'方法是否總是使用相同的委託簽名Function 或者是用戶定義的委託簽名? – webworm 2011-05-13 18:18:56

0

您可以將Find方法看作List中調用您傳遞的delegate的每個值的循環。請注意,它不會返回bool。它返回List的泛型類型。

基本上,你可以寫你自己:

string Find(List<string> dinosaurs) 
{ 
    for (string dinosaur in dinosaurs) 
    { 
     if (EndsWithSaurus(dinosaur)) 
     { 
      return dinosaur; 
     } 
    } 

    return null; 
}