Szukam dobrych samouczków na temat tworzenia akcesoriów / interfejsów API LINQ dla moich klas biznesowych. Aby ktoś mógł w końcu wprowadzić coś takiego w programie -
var potentialCustomers = from people in county
where people.NumberOfCats > 2
select people
Używałem LINQ dość często z kolekcjami .Net, ale nigdy wcześniej nie robiłem tego na własnych klasach. Czy to tylko kwestia implementacji IEnumerable, czy też potrzebne są dodatkowe kroki?
Odpowiedzi:
1 dla odpowiedzi № 1Musisz tylko wdrożyć IEnumerowalny interfejs w swojej klasie, a następnie możesz użyć LINQ.
Ponieważ LINQ to zestaw rozszerzeń dla IEnumerable
obiekty
2 dla odpowiedzi nr 2
LINQ to ciekawa bestia.
Natychmiast IEnumerable<T>
przychodzi na myśl podczas omawiania LINQ. Wygląda na to że IEnumerable<T>
jest LINQ, ale tak nie jest. IEnumerable<T>
jest jedną implementacją metod LINQ, która umożliwia zapisywanie zapytań LINQ względem obiektów, które implementują IEnumerable<T>
.
Inną implementacją jest IObservable<T>
który zasila Reaktywne rozszerzenia Microsoft. Jest to zestaw rozszerzeń, które pozwalają na zapisywanie zapytań LINQ w odniesieniu do zdarzeń (lub strumieni danych). Nie ma to nic wspólnego z IEnumerable<T>
.
LINQ można również zapisać bezpośrednio w twoich obiektach - wcale nie musi to być metoda rozszerzenia.
Na przykład zdefiniuj klasy A
i B
jak na przykład:
public class A
{
public B Select(Func<A, B> selector)
{
return selector(this);
}
}
public class B
{
public B(A a) { }
}
Teraz mogę napisać ten kod:
B query =
from x in a
select new B(x);
To LINQ, Jim, ale nie tak, jak wiemy.
W ten sposób można zdefiniować wszystkich operatorów LINQ. Dopóki kompilator zobaczy metody z odpowiednim podpisem, jesteś złoty.
Powiedziawszy to, zapytania LINQ są naturalne podczas pracy z szeregiem wartości - i dlatego właśnie IEnumerable<T>
i IObservable<T>
są dobrymi przykładami LINQ w akcji. Ale z pewnością możliwe jest zdefiniowanie LINQ względem dowolnego typu, który ci się podoba, po prostu za pomocą odpowiednich metod.