2010-10-01 14 views
33

mam zbiór, który zawiera dwa rodzaje obiektów A & B.LINQ wybór według rodzaju obiektu

Class Base{} 
Class A : Base {} 
Class B : Base {} 

List<Base> collection = new List<Base>(); 
collection.Add(new A()); 
collection.Add(new B()); 
collection.Add(new A()); 
collection.Add(new A()); 
collection.Add(new B()); 

Teraz chcę zaznaczyć obiekty z kolekcji na podstawie jego typu (A lub B, nie oba).

Jak mogę napisać zapytanie LINQ? Proszę pomóż mi. W przeciwnym razie muszę przechodzić przez kolekcję, której nie chcę. Dzięki.

Edytuj:

Dziękuję wszystkim za pomoc. Teraz mogę użyć OfType() z LINQ. Ale myślę, że w moim przypadku to nie zadziała. Moja sytuacja to:

Teraz chcę wybrać kontener z kontenerów, który ma co najmniej jeden typ A. Może być to nie może być wykonane przez LINQ. Wielkie dzięki.

+3

Czy możesz rozwinąć swoją edycję? Co masz na myśli przez "wybierz kontener"? –

+0

Lub po prostu stwórz nowe pytanie ... – WoIIe

Odpowiedz

69

Można użyć OfType metody Linq na to:

var ofTypeA = collection.OfType<A>(); 

dotycząceTwojego niechęć do pętli throught kolekcji, należy pamiętać, że LINQ nie robić magiczne sztuczki; Nie sprawdziłem implementacji OfType, ale byłbym zaskoczony nie, aby znaleźć tam pętlę lub iterator.

+0

Dzięki Fredrik. Mam jeszcze jedno pytanie, jeśli więcej niż jedna osoba odpowiedziała poprawnie, jaką odpowiedź muszę zrobić jako "Poprawna odpowiedź"? – jaks

+2

@Jai: Należy oznaczyć odpowiedź, która okazała się najbardziej przydatna lub pomocna. Zarówno Jared, jak i Fredrik mają rację, ale odpowiedź Fredrika była głębsza i może pomóc ci dowiedzieć się więcej. –

+0

@Jai: rzucić monetą? Tutaj jest flipper, jeśli go potrzebujesz: http://www.random.org/coins/?num=1&cur=20-novelty.voting-2004 - nie mogę znaleźć monety do głosowania między mną a @JaredPar , więc będziesz musiał zrobić z Kerry vs. Bush. Zostawię to, abyś zdecydował, kto jest kim;) –

11

Można użyć metody rozszerzenie OfType tego

IEnumerable<A> filteredToA = list.OfType<A>(); 
IEnumerable<B> filteredToB = list.OfType<B>(); 
+0

Dzięki za tony JaredPar. – jaks

7

pod względem kompletności, tutaj jest kod źródłowy Enumerable.OfType<T>.

public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source) { 
    if (source == null) throw Error.ArgumentNull("source"); 
    return OfTypeIterator<TResult>(source); 
} 

static IEnumerable<TResult> OfTypeIterator<TResult>(IEnumerable source) { 
    foreach (object obj in source) { 
     if (obj is TResult) yield return (TResult)obj; 
    } 
} 

Widać, że leniwie ocenia strumień źródłowy.

Powiązane problemy