2012-06-17 7 views
7

Я хочу добавить поддержку LINQ для своего парсера Apple Property List (бинарный, JSON и XML), чтобы я мог использовать SQL-запросы на нем, как вы можете, с помощью System.Xml. Он работает путем полного разбора файла и сохранения его в куче. (например System.Xml.).Добавление LINQ к моим классам

Я был Google и не мог понять, что-либо из этого (я получаю много Using LINQ to SQL Classes страниц). Руководство по MSDN, я тоже не понимаю. Что мне нужно сделать?

ответ

17

Реализация 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# выполнить всю вашу работу, все будет намного проще.

+2

btw, хорошая запись в блоге! –

1

Поскольку LINQ для объектов работает с любым классом, который наследует от IEnumerable<t>, наследуя этот интерфейс в вашем классе и определяя метод GetEnumerable, должно быть достаточно.

Следующая ссылка объясняет о том, как реализовать IEnumerable интерфейс (хотя это не говоря уже о LINQ, он будет работать): http://codebetter.com/davidhayden/2005/03/08/implementing-ienumerable-and-ienumerator-on-your-custom-objects/

1

Вы должны реализовать IEnumerable первый. Read, что первый - http://msdn.microsoft.com/en-us/library/9eekhta0.aspx

+0

реализовать как в наследовании? –

+0

Into С # вы должны объявить его как наследование и реализовать все члены, определенные в интерфейсе. E.g.если у вас есть интерфейс _IBoostable_, который содержит метод с описанием _void НЧ (INT мультипликатора); _, вы должны написать что-то вроде этого «класса MyClass: IBoostable { общественного недействительными подталкивания (интермедиат множитель) { йоЗотеЬЫпд (множитель); } } ' –

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