Вам на самом деле не нужно писать отдельную функцию, чтобы делать то, что вы хотите достичь, все это можно сделать с помощью Linq
напрямую:
var users = new Dictionary<int, Transformable>
{
{0, new Assistant { Name = "Joe" }},
{1, new Professor { Name = "John" }},
{2, new Assistant { Name = "Jane" }}
};
var assistants = users.Values.OfType<Assistant>().Where(a => a.Name == "Jane");
assistants
- это IEnumerable<Assistant>
с именем, равным «Джейн» и будет содержать только 1 запись из словаря выше. Вы можете добавить ToList () в конец этого списка, чтобы создать список альтернативно
Затем вы можете добавить любой предикат, который вы хотите:
var assistants = users.Values.OfType<Assistant>().Where(a => a.Name == "Jane" && a.LastName == "Smith" && a.Active);
Вы можете обернуть вышеупомянутое в функцию, но чтов итоге вы не будете намного короче, чем указано выше.
В качестве метода расширения он будет выглядеть следующим образом:
public static class Extensions
{
public static IEnumerable<T> Find<T>(this IEnumerable<Transformable> list, Func<T,bool> predicate) where T :Transformable
{
return list.OfType<T>().Where(predicate.Invoke);
}
}
, делая вызов немного короче:
var assistants = users.Values.Find<Assistant>(a => a.Name == "Jane");
Это пример свободного API-шаблона, поэтому вы можете использовать его в цепочке Linq, как и любую другую функцию Linq.