sirve que para ejemplo data c# .net wpf data-binding collections

c# - que - observablecollection xamarin



Ordenando una colección compuesta (3)

Por lo tanto, WPF no admite la clasificación estándar o el comportamiento de filtrado para las vistas de CompositeCollections, entonces, ¿cuál sería una mejor práctica para resolver este problema?

Hay dos o más colecciones de objetos de diferentes tipos. Desea combinarlos en una única colección clasificable y filtrable (con la implementación manual de ordenar o filtrar).

Uno de los enfoques que he considerado es crear una nueva colección de objetos con solo unas pocas propiedades centrales, incluidas las que me gustaría que ordenara la colección, y una instancia de objeto de cada tipo.

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

Y luego recorra mis dos colecciones de objetos para crear la nueva colección compuesta. Obviamente, este es un método de fuerza bruta, pero funcionaría. Obtendría todo el comportamiento de clasificación y filtrado de vista predeterminado en mi nueva colección de objetos compuestos, y podría poner una plantilla de datos en él para mostrar mis elementos de lista correctamente dependiendo de qué tipo está realmente almacenado en ese elemento compuesto.

¿Qué sugerencias hay para hacer esto de una manera más elegante?


El método de "fuerza bruta" que mencionas es en realidad la solución ideal. Eso sí, todos los objetos están en la RAM, no hay cuellos de botella de E / S, por lo que puedes ordenar y filtrar millones de objetos en menos de un segundo en cualquier computadora moderna.

La forma más elegante de trabajar con colecciones es el espacio de nombres System.Linq en .NET 3.5

Gracias. También consideré LINQ para los objetos, pero mi preocupación es la pérdida de flexibilidad para las plantillas de datos tipeados, que necesito para mostrar los objetos en mi lista.

Si no puede predecir en este momento cómo las personas clasificarán y filtrarán su colección de objetos, entonces debería mirar el espacio de nombres System.Linq.Expressions para construir sus expresiones lambda bajo demanda durante el tiempo de ejecución (primero permite que el usuario construya la expresión, luego compila , ejecute y al final use el espacio de nombre de reflexión para enumerar a través de los resultados). Es más complicado entenderlo, pero es una característica invaluable, probablemente (para mí definitivamente) aún más innovadora que el propio LINQ.


Todavía no estoy muy familiarizado con WPF, pero veo esto como una pregunta sobre la clasificación y el filtrado de List<T> colecciones de List<T> .

(al tener que implementar manualmente el género o el filtro)

¿Te importaría reconsiderar la implementación de tus propias funciones de clasificación o filtro? En mi experiencia, es fácil de usar. Los ejemplos a continuación usan un delegado anónimo pero puede definir fácilmente su propio método o una clase para implementar un tipo complejo o filtro. Dicha clase podría incluso tener propiedades para configurar y cambiar la clasificación y el filtro de forma dinámica.

Utilice List<T>.Sort(Comparison<T> comparison) con su función de comparación personalizada:

// 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 enfoque similar para obtener una subcolección de elementos de la lista.

Use List<T>.FindAll(Predicate<T> match) con su función de filtro personalizada:

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


Actualización: encontré una solución mucho más elegante:

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

Descubrí que debido a la reflexión, el tipo específico almacenado en Obj1 se resuelve en tiempo de ejecución y el tipo específico de DataTemplate se aplica como se esperaba.