在通用列表集合中搜索字符串模式

时间:2011-05-13 17:36:01

标签: .net list generics

我有一个文件名字符串的通用列表。我想只抓取与特定模式匹配的值。我找了一些关于在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传递给它,但是我看不到它被放在哪里

2 个答案:

答案 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