作为职能委派

时间:2010-10-21 02:32:05

标签: c# delegates

下面的功能正常,但我想简化。

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

更新

坚持使用.NET 2.0,所以我不能使用LINQ

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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));
    }

答案 2 :(得分:0)

我建议您阅读C#

中的标准委托类型

这里你实际上需要一个Predicate,它接受一个对象,用一些条件测试它并返回一个pass / fail结果。

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