2012-06-17 13 views
7

Chcę dodać obsługę LINQ do mojego parsera Apple Property List (lista właściwości) (binarna, JSON i XML), aby można było używać zapytań SQL takich jak z System.Xml. Działa poprzez całkowite przeanalizowanie pliku i zapisanie go na stercie. (jak robi to System.Xml).Dodawanie LINQ do moich klas

Byłem Googling i wydaje się nie rozumiem żadnego z nich (otrzymuję wiele stron Using LINQ to SQL Classes). Przewodnik po MSDN, również nie rozumiem. Co muszę zrobić?

Odpowiedz

17

Wdrażanie LINQ oznacza po prostu wdrożenie metod LINQ oczekuje tam być, jak Where lub Select, z prawidłowymi podpisami. Pomimo powszechnej percepcji, nie musisz implementować interfejsu IEnumerable dla twojej klasy, aby obsługiwać LINQ. Jednak implementacja IEnumerable spowoduje automatyczne pobranie całego zestawu metod LINQ na klasie Enumerable - wystarczy zaimplementować tylko klasę GetEnumerator i klasę IEnumerator.

Istnieje kilka przykładów, jak wdrożyć IEnumerable na moim blogu, w tym poście o the Iterator pattern.

Jeśli jednak nie ma sensu, aby klasa była wymienna, nie trzeba tego robić. Trzeba tylko wdrożyć odpowiednie metody LINQ bezpośrednio. LINQ tak naprawdę nie obchodzi, jak metody zostaną zdefiniowane, o ile kompiluje C#. Oznacza to, że jeśli piszesz:

from p in myPlist where p.Thing == "Thing" select p; 

kompilator C# przekłada się to na:

mpPlist.Where(p => p.Thing == "Thing").Select(p => p); 

Dopóki że kompiluje, LINQ będzie działać. Aby zobaczyć poprawne podpisy dla metod, spójrz na dokumentację MSDN list of LINQ query methods. Na przykład (zakładamy, że PList była lista PListItem s):

public class PList 
{ 
    public IEnumerable<PListItem> Where(Func<PListItem, bool> predicate) 
    { 
    foreach (var item in this.items) 
    { 
     if (predicate(item)) 
     { 
     yield return item; 
     } 
    } 
    } 
} 

Realizując LINQ bezpośrednio w ten sposób daje dużo większą kontrolę nad tym, jak się zachowuje, to dużo więcej pracy, aby ją dobrze, i musisz zrozumieć konsekwencje swoich wartości zwracanych i łączenia połączeń LINQ, itp. Ogólnie rzecz biorąc, jeśli możesz uciec z wprowadzeniem klasy implementacji IEnumerable i pozwolić C# wykonać całą pracę dla ciebie, rzeczy idą dużo łatwiej.

+2

btw, ładny post na blogu! –

1

musi zaimplementować IEnumerable pierwszy. Przeczytaj ten pierwszy - http://msdn.microsoft.com/en-us/library/9eekhta0.aspx

+0

implementować jak w odziedziczeniu? –

+0

Do С # należy zadeklarować go jako dziedziczenie i wdrożyć wszystkie elementy, zdefiniowane w interfejsie. E.g.jeśli masz interfejs _IBoostable_ który zawiera metody z opisu _void wzmocnienia (int mnożnika); _, musisz napisać coś takiego „class MojaKlasa: IBoostable { public void doładowania (int mnożnik) { doSomething (mnożnik); } } ' –

Powiązane problemy