2014-10-12 3 views
-1

그래서 개체 컬렉션이 있습니다. 오브젝트는 유형이 다르지만 모든 유형은 단일 기본 클래스에서 파생됩니다. 컬렉션을 반복하고 특정 파생 된 유형의 객체를 확인하고 해당 객체의 기본 클래스에서 메소드를 호출하려고합니다. 이것은 내가 가지고있는 것입니다 :LINQ의 특정 유형의 모든 항목에 대한 메서드 호출

dim DogQuery = From Dog as DogBase in DogCollection 
       Where Dog.GetType = GetType(DogBeagle) 
       Select Dog 

For Each d as DogBase in DogQuery 
    d.Feed() 
Next 

...하지만 그것은 우아하지 않습니다. 특히 ...

For Each Dog as DogBase in DogCollection 
    If Dog.GetType = GetType(DogBeagle) then 
     Dog.Feed() 
    End If 
Next 

... (주관적으로) 더 엄격한 코드로 동일한 작업을 수행합니다.

즉각적인 실행에 대한 필자의 독서는 LINQ가 싱글 톤을 반환하도록하거나 .ToList()와 같은 것을 호출하도록하는 유일한 방법이라고 제안합니다. 추가 단계가 필요없이 즉각적인 실행을 할 수있는 방법이 있습니까? 아니면 LINQ가 과부하가되고있는 바로 그 경우입니까?

답변

3

이 경우 OfType을 사용할 수 있습니다.

For Each beagle As DogBeagle In DogCollection.OfType(Of Beagle) 
    beagle.Feed() 
End For 
+0

이것은 내가 찾고 있었던 것보다 더 나은입니다. 감사합니다! 나는 S/O가 나를 허용하자마자 받아 들일 것이다. :) – DWRoelands

3

지연된/즉시 실행은 여기에서 관련이 없습니다. ToList()을 호출하면 아무 것도 변경되지 않습니다.

이렇게 간단하게 만들 수있는 두 가지 옵션이 있습니다.

당신이 정확한 Dog 유형으로 필요하지 않은 경우 첫째

,하지만 DogBeagle 또는 DogBeagle에서 파생 아무것도, 당신은 OfType 사용할 수 있습니다

For Each d As DogBeagle in DogCollection.OfType(Of DogBeagle)() 
    d.Feed() 
Next 

당신이 정말로 정확한 원하는 경우 유형을 사용하는 경우 실제로는 Where 절만 사용한다는 사실을 사용할 수 있습니다. 결과는 변형되지 않습니다. 따라서, LINQ는 과잉이 아니라 쿼리 식는 그냥 직접 Where을 사용할 수 있습니다 ...입니다 :

For Each d As Dog in DogCollection.Where(Function(x) x.GetType() = GetType(DogBeagle)) 
    d.Feed() 
Next 
관련 문제