2009-08-18 3 views
1

Я понимаю, как использовать делегатов, и я в порядке с лямбда-выражениями, чтобы использовать предикаты. Я пришел к точке, где я хочу, чтобы реализовать метод, который использует предикат в качестве аргумента и не могу понять, как ссылаться на предикат, чтобы найти спички в моей коллекции:Как реализовать алгоритм соответствия с использованием предикатов?

private static T FindInCollection<T>(ICollection<T> collection, Predicate<T> match) 
{ 
    foreach (T item in collection) 
    { 
     //So how do I reference match to return the matching item? 
    } 
    return default(T); 
} 

Я хочу, чтобы затем ссылаться на это, используя что-то похожее на:

ICollection<MyTestClass> receivedList = //Some list I've received from somewhere else 
MyTestClass UsefulItem = FindInCollection<MyTestClass>(receivedList, i => i.SomeField = "TheMatchingData"); 

Если кто-нибудь может дать мне объяснение или указать мне ссылку о реализации предикатами, я ценю это. Документация там, кажется, все относятся к прохождению предикаты (которые я могу сделать, просто отлично), на самом деле не реализует функциональность, которая использует их ...

Благодаря

+0

Почему вы не можете использовать метод Where? –

+0

@Cameron: D'oh! причина, по которой я не мог ее использовать, - это потому, что я не ссылался на System.Linq, ха-ха! Я думал, что смогу использовать его, но он не появился в intellisense. Мне нужно больше спать. Лол спасибо. – BobTheBuilder

+0

@Cameron: Хотя это всегда полезно для реализации, поэтому предоставленный ответ - в то время как лишние теперь могут по-прежнему обеспечивать использование в других ситуациях. – BobTheBuilder

ответ

7
private static T FindInCollection<T>(ICollection<T> collection, Predicate<T> match) 
{ 
    foreach (T item in collection) 
    { 
     if (match(item)) 
      return item; 
    } 
    return default(T); 
} 

Вы просто использовать предикат, как любой другого делегата. Это метод, который вы можете вызвать с любым аргументом типа T, который вернет true.

+0

Спасибо, я просто не мог найти информацию об этом простом пропущенном куске головоломки. Спасибо за быстрый ответ! +1 – BobTheBuilder

Смежные вопросы