Třídění kompozitní sbírku

hlasů
6

Takže WPF nepodporuje standardní třídění nebo filtrování chování pro výhled CompositeCollections, takže to, co by bylo nejlepší praxe pro řešení tohoto problému.

K dispozici jsou dva nebo více objektů sbírky různých typů. Chcete-li zkombinovat do jednoho sortable a filtrovatelné kolekce (withing museli ručně provádět jakousi nebo filtr).

Jedním z přístupů jsem uvažovaných je vytvořit novou kolekci objektů s pouze několika klíčových vlastností, včetně těch, které bych chtěl sběr řazen a objekt instance jednotlivých typů.

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

A pak procházet mých dvou objektových sbírek vybudovat novou kolekci kompozitní. Zřejmě je to trochu metody hrubé síly, ale že to bude fungovat. Já bych si všechny třídění výchozí zobrazení a chování filtrování na mé nové kolekce složeného objektu, a byl bych schopen dát šablonu dat na něj se zobrazí mé položky seznamu správně podle toho, jaký typ je ve skutečnosti uloženy v tomto kompozitním bodu.

Jaký návrhy jsou tam dělá to ve více elegantním způsobem?

Položena 14/08/2008 v 17:30
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

UPDATE: Zjistil jsem, mnohem elegantnější řešení:

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

Zjistil jsem, že v důsledku odrazu, specifický typ uložené v obj1 je vyřešen v době běhu a konkrétní DataTemplate typu se aplikuje podle očekávání!

Odpovězeno 23/08/2008 v 04:48
zdroj uživatelem

hlasů
1

Nejsem ještě velmi dobře obeznámeni s WPF, ale vidím to jako otázku o řazení a filtrování List<T>sbírky.

(Withing museli ručně provádět seřadit nebo filtr)

Chtěli byste znovu zvážit implementaci své vlastní třídící nebo filtrační funkce? Z vlastní zkušenosti vím, že je snadné použití. Níže uvedené příklady používají anonymní delegát, ale můžete snadno definovat vlastní metodu nebo třídu implementovat komplexní druh nebo filtr. Taková třída by se dokonce mít vlastnosti konfigurovat a měnit třídit a filtrovat dynamicky.

Použít List<T>.Sort(Comparison<T> comparison)se svým zvykem srovnávat funkce:

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

Podobný přístup pro získání dílčí kolekce položek ze seznamu.

Použít List<T>.FindAll(Predicate<T> match)s funkcí vlastního filtru:

// 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);
}
Odpovězeno 14/08/2008 v 19:37
zdroj uživatelem

hlasů
1

„Hrubou silou“ metoda se zmiňujete, je skutečně ideálním řešením. Nezapomínejme, že všechny objekty jsou v paměti RAM, není I / O překážkou, takže si můžete do značné míry třídit a filtrovat miliony předmětů za méně než jednu sekundu na jakémkoli moderním počítači.

Nejelegantnější způsob, jak pracovat s kolekcí je System.Linq názvů v .NET 3.5

Díky - jsem také považován LINQ k objektům, ale moje obavy, že je ztráta pružnosti pro zadaný datové šablony, které musím zobrazit objekty v mém seznamu.

Pokud nemůžete předpovídat v tuto chvíli, jak se lidé budou třídit a filtrovat svou sbírku objektů, pak byste se měli podívat na System.Linq.Expressions názvů budovat své lambda výrazy na vyžádání za běhu (Nejprve je umožnit uživateli vytvořit výraz, pak kompilovat spusťte a na konci použití odraz názvů výčtu výsledků). Je to složitější zabalit hlavu kolem něj, ale neocenitelnou vlastnost, pravděpodobně (pro mě definitivně) ještě více funkcí průkopnický než samotný LINQ.

Odpovězeno 14/08/2008 v 17:38
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more