Domanda

Così WPF non supporta standard di ordinamento o il comportamento dei filtri per le viste di CompositeCollections, così che cosa sarebbe una best practice per la soluzione di questo problema.

Ci sono due o più insiemi di oggetti di tipi diversi.Si vogliono riunire in un unico ordinabile e filtrabili raccolta (entro dover implementare manualmente ordinare o filtrare).

Uno degli approcci ho considerato è quello di creare una nuova collezione di oggetti con solo un paio di core proprietà, compresi quelli che vorrei, la collezione ordinati, e un'istanza di un oggetto di ogni tipo.

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

E poi un ciclo attraverso le mie due raccolte di oggetti per costruire il nuovo composito di raccolta.Ovviamente questo è un po ' un metodo forza bruta, ma che avrebbe funzionato.Mi piacerebbe avere tutte le impostazioni di visualizzazione di ordinamento e filtraggio comportamento sul mio nuovo composito oggetto di raccolta, e mi piacerebbe essere in grado di mettere un modello di dati su di esso per visualizzare la mia lista di elementi correttamente a seconda che il tipo è effettivamente memorizzati nel manufatto.

Quali suggerimenti ci sono per fare questo in un modo più elegante?

È stato utile?

Soluzione 3

Aggiornamento:Ho trovato un modo molto più elegante soluzione:

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

Ho scoperto che a causa della riflessione, il tipo specifico memorizzati in Obj1 è risolta in fase di esecuzione e il tipo specifico modello di dati è applicata come previsto!

Altri suggerimenti

Io non sono ancora molto esperto con WPF, ma io vedo questo come una domanda sull'ordinamento e filtraggio List<T> collezioni.

(entro dover implementare manualmente ordinare o filtrare)

Sarebbe la rivalutazione di implementare il proprio ordinamento o funzioni di filtro?Nella mia esperienza, è di facile utilizzo.Gli esempi riportati di seguito uso di un delegato anonimo, ma si potrebbe facilmente definire il proprio metodo o una classe di attuare un complesso di ordinare o filtrare.Una classe può anche avere proprietà per configurare e modificare l'ordinamento e filtro in modo dinamico.

Utilizzare List<T>.Sort(Comparison<T> comparison) personalizzato con i vostri funzione di confronto:

// 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);
};

Un approccio simile per ottenere un sotto-insieme di elementi dall'elenco.

Utilizzare List<T>.FindAll(Predicate<T> match) personalizzato con i vostri funzione di filtro:

// 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);
}

"Forza bruta" metodo che hai menzionato è effettivamente la soluzione ideale.Intendiamoci, tutti gli oggetti sono in RAM, non c'è I/O collo di bottiglia, quindi si può tranquillamente ordinare e filtrare i milioni di oggetti in meno di un secondo su tutti i computer moderni.

Il modo più elegante per lavorare con le collezioni di Sistema.Linq spazio dei nomi .NET 3.5

Grazie, ho anche considerato LINQ to gli oggetti, ma la mia preoccupazione è la perdita di di flessibilità per i dati tipizzati i modelli che ho bisogno di visualizzare il gli oggetti nella mia lista.

Se non si può prevedere, in questo momento, come la gente di ordinare e filtrare la tua collezione di oggetti, allora si dovrebbe guardare Sistema.Linq.Espressioni spazio dei nomi per costruire il vostro espressioni lambda su richiesta durante la fase di esecuzione (prima di consentire all'utente di costruire espressione, quindi compilare, eseguire e alla fine si utilizza la riflessione dello spazio dei nomi di enumerare i risultati).E ' più difficile da avvolgere la testa intorno ad esso, ma preziosa funzione, probabilmente (per me definitivamente) ancora più innovativa funzione di LINQ stesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top