Реализация LINQ просто означает реализацию методов LINQ ожидает, чтобы быть там, такими как Where
или Select
, с правильными подписями. Несмотря на общее восприятие, вам не нужно реализовывать интерфейс IEnumerable
для вашего класса для поддержки LINQ. Однако реализация IEnumerable
будет автоматически доставит вам весь набор методов LINQ на классе Enumerable
почти бесплатно - вам нужно будет только реализовать GetEnumerator
и класс IEnumerator
.
Есть несколько примеров того, как реализовать IEnumerable
в своем блоге, в этом посте около the Iterator pattern.
Однако, если для вашего класса нет смысла перечислить, вам не нужно это делать. Вам просто нужно реализовать соответствующие методы LINQ напрямую. LINQ на самом деле не заботится о том, как методы определяются, пока компиляция C#. То есть, если вы пишете:
from p in myPlist where p.Thing == "Thing" select p;
компилятор С # транслирует это в:
mpPlist.Where(p => p.Thing == "Thing").Select(p => p);
Пока что компилируется, LINQ будет работать. Чтобы увидеть правильные подписи для методов, посмотрите, как list of LINQ query methods документация MSDN. Например (предположим, что ваш PList
был список PListItem
с):
public class PList
{
public IEnumerable<PListItem> Where(Func<PListItem, bool> predicate)
{
foreach (var item in this.items)
{
if (predicate(item))
{
yield return item;
}
}
}
}
При реализации LINQ непосредственно таким образом, дает намного больший контроль над тем, как он ведет себя, это много больше работы, чтобы получить его правильно, и вам нужно понять последствия ваших возвращаемых значений и связать вызовы LINQ и т. д. В общем, если вам удастся избежать реализации вашего класса IEnumerable
и позволить C# выполнить всю вашу работу, все будет намного проще.
btw, хорошая запись в блоге! –