2008-08-14 18 views
6

WPF는 CompositeCollections 뷰의 표준 정렬 또는 필터링 동작을 지원하지 않으므로이 문제를 해결하기위한 최선의 방법은 무엇입니까?복합 컬렉션 정렬

여러 유형의 개체 모음이 두 개 이상 있습니다. 그것들을 하나의 정렬 가능하고 필터링 가능한 컬렉션으로 결합하고자합니다 (수동으로 정렬 또는 필터를 구현할 필요가 있음).

필자가 고려한 접근법 중 하나는 콜렉션이 정렬되기를 원하는 몇 가지 핵심 속성과 각 유형의 객체 인스턴스를 포함하여 새로운 객체 컬렉션을 만드는 것입니다.

class MyCompositeObject 
{ 
    enum   ObjectType; 
    DateTime  CreatedDate; 
    string   SomeAttribute; 
    myObjectType1 Obj1; 
    myObjectType2 Obj2; 
{ 
class MyCompositeObjects : List<MyCompositeObject> { } 

그리고 두 개의 객체 컬렉션을 반복하여 새로운 복합 컬렉션을 만듭니다. 분명히 이것은 무차별 방식의 비트이지만 작동 할 것입니다. 모든 기본보기 정렬 및 내 새 복합 개체 컬렉션에 동작을 필터링 얻을 것이다 및 해당 복합 항목에 실제로 저장된 형식에 따라 내 목록 항목을 제대로 표시하려면 데이터 서식 파일을 넣을 수 있습니다.

더 세련된 방식으로 어떤 효과가 있습니까?

답변

1

업데이트 : 사용자 정의 필터 기능

사용 List<T>.FindAll(Predicate<T> match) 내가 인해 반사, OBJ1에 저장되어있는 특정 유형이 발견

class MyCompositeObject 
{ 
    DateTime CreatedDate; 
    string  SomeAttribute; 
    Object  Obj1; 
{ 
class MyCompositeObjects : List<MyCompositeObject> { } 

: 나는 훨씬 더 우아한 해결책을 발견 런타임에 해결되고 유형별 DataTemplate이 예상대로 적용됩니다!

1

"Brute Force"방법은 실제로 이상적인 솔루션입니다. 모든 개체가 RAM에 있고, I/O 병목 현상이 없으므로 최신 컴퓨터에서 수백만 가지 개체를 1 초 내에 정렬하고 필터링 할 수 있습니다. 나는 또한 객체에 LINQ를 고려,하지만 내 관심사는 입력 된 데이터 를위한 유연성 손실이 -

컬렉션을 작업하는 가장 우아한 방법은 .NET에서의 System.Linq 네임 스페이스 3.5

감사입니다 템플릿, 내 목록에 개체를 표시해야합니다. 당신은 사람들이 정렬 개체 모음을 필터링하는 방법을 지금이 순간에 예측할 수없는 경우

, 당신은 첫 번째 (런타임을 필요에 따라 귀하의 람다 표현식을 구축 네임 스페이스 System.Linq.Expressions 봐야한다 사용자가 표현식을 작성한 다음 컴파일하고 실행하고 마지막에는 반사 네임 스페이스를 사용하여 결과를 열거합니다. LINQ 자체보다는 머리를 감싸는 것이 더 귀찮은 기능이지만 아마도 (나에게는 분명히) 훨씬 더 획기적인 기능입니다.

+0

lubos : 감사합니다. 또한 LINQ를 개체로 간주했지만, 내 목록에 개체를 표시해야하는 입력 된 데이터 템플릿에 대한 유연성이 떨어지는 것이 걱정됩니다. –

1

저는 아직 WPF에 익숙하지 않지만 이것을 정렬 및 필터링 List<T> 컬렉션에 대한 질문으로 봅니다.

당신이 당신의 자신의 종류 또는 필터 기능을 구현 재고겠습니까

(수동 정렬 또는 필터를 구현하는 데 withing에)? 내 경험으로는 사용하기 쉽습니다. 아래 예제에서는 익명의 대리자를 사용하지만 복잡한 메서드 나 필터를 구현할 클래스 나 메서드를 쉽게 정의 할 수 있습니다. 이러한 클래스에는 정렬 및 필터를 동적으로 구성하고 변경할 수있는 속성이있을 수도 있습니다. 목록에서 항목의 하위 집합을 얻기를위한

// Sort according to the value of SomeAttribute 
List<MyCompositeObject> myList = ...; 
myList.Sort(delegate(MyCompositeObject a, MyCompositeObject b) 
{ 
    // return -1 if a < b 
    // return 0 if a == b 
    // return 1 if a > b 
    return a.SomeAttribute.CompareTo(b.SomeAttribute); 
}; 

유사한 방법 : 사용자 정의와

사용 List<T>.Sort(Comparison<T> comparison) 기능을 비교합니다.

// Select all objects where myObjectType1 and myObjectType2 are not null 
myList.FindAll(delegate(MyCompositeObject a) 
{ 
    // return true to include 'a' in the sub-collection 
    return (a.myObjectType1 != null) && (a.myObjectType2 != null); 
} 
+0

Brian : MyCompositeObject를 빌드하고 나면 ICollectionView의 일부로 무료로 정렬 및 필터링을 수행합니다. 문제의 핵심은 개별 객체 유형 컬렉션을 처리하고이를 하나의 컬렉션으로 취급하는 것입니다. 복합 컬렉션은 컬렉션 생성에 대한 대답이지만 정렬 필터링은 아닙니다. –