Используйте лямбда:
Uri u = new Uri("www.test.com");
CustomClass cc = this.files.Find(cc => cc.Path == u);
или, если вам все еще нужен именованный метод:
static bool matchesUri(CustomClass cc, Uri _u)
{
return cc.Path == _u;
}
Uri u = new Uri("www.test.com");
CustomClass cc = this.files.Find(cc => matchesUri(cc, u));
Вы можете написать
CustomClass cc = this.files.Find( p=> p.Path == u );
Метод Find () возвращает null, если не было найдено ни одного элемента, соответствующего предикату.
Только для полноты, вот что вы бы сделали, если бы не хотели использовать лямбду:
// Predicate must be a method with a single parameter,
// so we must pass the other parameter in constructor
public class UriMatcher
{
private readonly Uri _u;
public UriMatcher(Uri u)
{
_u = u;
}
// Match is Predicate<CustomClass>
public bool Match(CustomClass cc)
{
return cc.Path == _u;
}
}
А затем используйте его как:
public void someMethod()
{
Uri u = new Uri("www.test.com");
UriMatcher matcher = new UriMatcher(u);
CustomClass cc = this.files.Find(matcher.Match);
}
Обратите внимание, что вы передаете ссылку на метод , а не результат метода - Match
vs Match ()
.
Также проверьте эту ветку: Предикатные делегаты в C # .
public void someMethod()
{
Uri u= new Uri("www.test.com");
CustomClass cc = this.files.find( p => { return p.Path == u; } );
}
Попробуйте использовать анонимный метод поиска и используйте любую локальную переменную внутри него. Если это вас не устраивает, вызовите свой обычно определенный метод делегата.
Ответ .NET 2.0 с использованием анонимного делегата (обратите внимание, что это работает только для C #, VB.NET не имеет анонимных делегатов).
public void someMethod()
{
Uri u= new Uri("www.test.com");
CustomClass cc = this.files.find(delegate(CustomClass oTemp) { return oTemp.Path == u;});
}