我有一个文件名字符串的通用列表。我想只抓取与特定模式匹配的值。我找了一些关于在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
方法期望将一个String传递给它,但是我看不到它被放在哪里
答案 0 :(得分:3)
如果你使用的是.NET 3.5+(在System.Linq命名空间中使用LINQ扩展方法),你可以这样做,它将返回你的匹配子集:
var results = dinosaurs.Where(d => d.EndsWith("saurus")).ToList();
要回答关于所示示例的其他问题,首先,Find()仅在找到匹配项时返回true / false,而不是匹配本身。另一方面,Where()返回匹配的子集。我喜欢LINQ用于这些类型的查询(Where()等)因为它们适用于任何IEnumerable
容器(List,HashSet,Array等)。
关于如何传递字符串的问题,Find()方法(和Where()等)采用委托Func<string, bool>
- 因为你的列表是一个字符串容器 - 告诉它是否匹配或不是,您显示的示例传递方法的名称,该方法将其分配给委托。只要方法满足Func<string, bool>
的签名,这意味着它需要一个字符串并返回一个bool。
有意义吗?
答案 1 :(得分:0)
您可以将Find
方法视为循环调用您传递的List
的{{1}}中的每个值。
注意,它不会返回delegate
。它返回bool
的泛型类型。
基本上,你可以写自己的:
List