Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对复合集合进行排序_C#_.net_Wpf_Data Binding_Collections - Fatal编程技术网

C# 对复合集合进行排序

C# 对复合集合进行排序,c#,.net,wpf,data-binding,collections,C#,.net,Wpf,Data Binding,Collections,所以WPF不支持CompositeCollections视图的标准排序或过滤行为,那么解决这个问题的最佳实践是什么呢 有两个或多个不同类型的对象集合。您希望将它们组合成一个可排序和可筛选的集合(ING必须手动实现排序或筛选) 我考虑过的一种方法是创建一个新的对象集合,其中只包含几个核心属性,包括我希望对集合进行排序的属性,以及每种类型的对象实例 class MyCompositeObject { enum ObjectType; DateTime

所以WPF不支持CompositeCollections视图的标准排序或过滤行为,那么解决这个问题的最佳实践是什么呢

有两个或多个不同类型的对象集合。您希望将它们组合成一个可排序和可筛选的集合(ING必须手动实现排序或筛选)

我考虑过的一种方法是创建一个新的对象集合,其中只包含几个核心属性,包括我希望对集合进行排序的属性,以及每种类型的对象实例

class MyCompositeObject
{
    enum           ObjectType;
    DateTime       CreatedDate;
    string         SomeAttribute;
    myObjectType1  Obj1;
    myObjectType2  Obj2;
{
class MyCompositeObjects : List<MyCompositeObject> { }
类MyCompositeObject
{
枚举对象类型;
创建日期时间;
字符串属性;
myObjectType1 Obj1;
myObjectType2 Obj2;
{
类MyCompositeObjects:列表{}
然后循环使用我的两个对象集合来构建新的复合集合。显然,这是一种蛮力方法,但它会起作用。我会在新的复合对象集合上获得所有默认的视图排序和筛选行为,并且我能够在其上放置一个数据模板,以便根据需要正确显示列表项该复合项中实际存储的类型

有什么建议可以更优雅地执行此操作?

您提到的“暴力”方法实际上是理想的解决方案。请注意,所有对象都在RAM中,没有I/O瓶颈,因此您可以在任何现代计算机上在不到一秒钟的时间内对数百万对象进行排序和过滤

使用集合最优雅的方式是.NET3.5中的System.Linq命名空间

谢谢-我也考虑过LINQ 物体,但我担心的是损失 类型化数据的灵活性 模板,我需要显示 我的列表中的对象


如果此时无法预测人们将如何对对象集合进行排序和筛选,那么您应该查看System.Linq.Expressions名称空间,以便在运行时根据需要构建lambda表达式(首先让用户构建表达式,然后进行编译、运行,最后使用反射名称空间枚举结果)。这更难理解,但可能是非常有价值的特性(对我来说是肯定的)甚至比LINQ本身更具开创性的特性。

我对WPF还不是很熟悉,但我认为这是一个关于排序和筛选
列表
集合的问题

(必须手动执行排序或筛选)

您会重新考虑实现自己的排序或筛选函数吗?根据我的经验,它很容易使用。下面的示例使用匿名委托,但您可以轻松定义自己的方法或类来实现复杂的排序或筛选。这样的类甚至可以具有动态配置和更改排序和筛选的属性。

通过自定义比较功能使用
List.Sort(比较)

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

更新:我发现了一个更优雅的解决方案:

class MyCompositeObject
{
    DateTime    CreatedDate;
    string      SomeAttribute;
    Object      Obj1;
{
class MyCompositeObjects : List<MyCompositeObject> { }
类MyCompositeObject
{
创建日期时间;
字符串属性;
对象Obj1;
{
类MyCompositeObjects:列表{}

我发现由于反射,Obj1中存储的特定类型在运行时被解析,并且类型特定的DataTemplate按预期应用!

lubos:谢谢-我也考虑了对象的LINQ,但我担心类型化数据模板会失去灵活性,我需要在列表中显示对象。Brian:Once MyCompositeObject是构建的,作为ICollectionView的一部分,我可以免费获得排序和筛选。问题的关键是处理单独的对象类型集合,并将它们视为一个集合。复合集合是创建集合的答案,但不是排序筛选。