سؤال

حتى WPF لا يدعم معيار فرز أو تصفية سلوك آراء CompositeCollections, ذلك ما يمكن أن يكون أفضل الممارسات من أجل حل هذه المشكلة.

هناك اثنين أو أكثر من وجوه مجموعات من أنواع مختلفة.كنت ترغب في الجمع بينهما في واحد للفرز و ترشيح مجموعة (withing الاضطرار إلى يدويا تنفيذ فرز أو تصفية).

واحدة من نهج لقد نظرت إلى إنشاء كائن جديد جمع سوى عدد قليل من الخصائص الأساسية ، بما في ذلك تلك التي أريد جمع فرز على مثيل كائن من كل نوع.

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

ثم حلقة من خلال بلدي اثنين من وجوه مجموعات بناء المركب الجديد جمع.ومن الواضح أن هذا هو قليلا من أسلوب القوة الغاشمة ، ولكن سيكون العمل.أود الحصول على كل طريقة العرض الافتراضية الفرز والتصفية السلوك على المركب الجديد الكائن جمع و كنت قد تكون قادرة على وضع بيانات القالب على ذلك إلى عرض قائمة العناصر بشكل صحيح اعتمادا على أي نوع هو في الواقع المخزنة في هذا المركب البند.

ما الاقتراحات هناك من أجل القيام بذلك بطريقة أكثر أناقة?

هل كانت مفيدة؟

المحلول 3

تحديث:لقد وجدت أكثر من ذلك بكثير أنيقة الحل:

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

لقد وجدت أنه بسبب انعكاس نوع معين المخزنة في Obj1 يتم حلها في وقت التشغيل ونوع محددة DataTemplate يطبق كما هو متوقع!

نصائح أخرى

أنا لم تكن مألوفة جدا مع WPF ولكن أرى أن هذا سؤال عن الفرز والتصفية List<T> مجموعات.

(withing الاضطرار إلى يدويا تنفيذ فرز أو تصفية)

هل تعيد النظر في تنفيذ الخاص بك فرز أو تصفية الوظائف ؟ في تجربتي فمن السهل للاستخدام.الأمثلة أدناه استخدام مجهول تفويض ولكن يمكن بسهولة تحديد الأسلوب الخاص بك أو فئة لتنفيذ مجمع فرز أو تصفية.هذه الدرجة يمكن أن يكون حتى خصائص تكوين وتغيير نوع فلتر حيوي.

استخدام List<T>.Sort(Comparison<T> comparison) مع مخصص مقارنة وظيفة:

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

نهج مماثل للحصول على sub-مجموعة من العناصر من القائمة.

استخدام List<T>.FindAll(Predicate<T> match) مع تصفية مخصص الوظيفة:

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

"القوة الغاشمة" الطريقة التي ذكرتها هي فعلا الحل المثالي.فتذكروا كل الكائنات في ذاكرة الوصول العشوائي ، لا يوجد اختناق I/O, بحيث يمكنك إلى حد كبير فرز وتصفية الملايين من الكائنات في أقل من ثانية على أي جهاز كمبيوتر حديث.

أجمل طريقة العمل مع مجموعات النظام.Linq مساحة الاسم .NET framework 3.5

شكرا - أنا أيضا النظر إلى LINQ الكائنات, ولكن قلقي هناك خسارة من المرونة في كتابة البيانات القوالب التي تحتاج إلى عرض الكائنات في القائمة.

إذا كنت لا يمكن التنبؤ في هذه اللحظة كيف أن الناس سوف فرز وتصفية جمع كائن, ثم يجب أن ننظر في النظام.Linq.التعبيرات مساحة لبناء تعبيرات لامدا على الطلب خلال وقت التشغيل (أول سمحت المستخدم لبناء التعبير ، ثم تجميع, تشغيل و في النهاية يمكنك استخدام انعكاس مساحة تعداد من خلال النتائج).هو أكثر صعبة التفاف حول رأسك ولكن ميزة لا تقدر بثمن ، وربما (لي نهائيا) أكثر الرائد ميزة من LINQ نفسها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top