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.
btw, ładny post na blogu! –