当前位置: 首页 > 编程语言 > C#

SortingCompositeCollections分享

时间:2023-04-10 22:20:52 C#

SortingCompositeCollections那么,WPF不支持CompositeCollections视图的标准排序或过滤行为,那么解决这个问题的最佳实践是什么。有两个或多个不同类型的对象集合。您希望将它们组合成一个可排序和可过滤的集合(排序或过滤必须手动实现)。我考虑过的一种方法是创建一个新的对象集合,其中只有几个核心属性,包括我希望集合作为排序依据的那些属性,以及每种类型对象的一个??实例。类MyCompositeObject{枚举对象类型;日期时间创建日期;字符串SomeAttribute;myObjectType1对象1;我的对象类型2Obj2;{classMyCompositeObjects:List{}然后迭代我的两个对象集合以构建新的复合集合。显然这是一种蛮力方法,但它会起作用。我将在新的复合对象集合上获得所有默认的视图排序和过滤行为,我可以在它上面放置一个数据模板,以根据实际存储在该复合项目中的类型正确显示列表项目。对于更优雅的方法有什么建议吗?我还不是很熟悉WPF,但我认为这是一个关于排序和过滤列表集合的问题。(排序或过滤必须手动实现)您会重新考虑实现自己的排序或过滤功能吗?根据我的经验,它很容易使用。下面的示例使用匿名委托,但您可以轻松定义自己的方法或类来实现复杂的排序或过滤。这样的类甚至可以具有动态配置和更改排序和过滤的属性。将List.Sort(Comparisoncomparison)与自定义比较函数一起使用://根据SomeAttributeList的值排序myList=...;myList.Sort(delegate(MyCompositeObjecta,MyCompositeObjectb){//return-1ifabreturna.SomeAttribute.CompareTo(b.SomeAttribute);};从列表中获取项目子集合的类似方法。将List.FindAll(Predicatematch)与您的自定义过滤器函数一起使用://选择myObjectType1和myObjectType2不为空的所有对象myList.FindAll(delegate(MyCompositeObjecta){//返回true以在子集合中包含“a”return(a.myObjectType1!=null)&&(a.myObjectType2!=null);}你提到的“蛮力”方法实际上是理想的解决方案。注意所有对象都在RAM中,没有I/O瓶颈,所以你可以在任何现代计算机上在不到一秒的时间内对数百万个对象进行排序和过滤。处理集合的最佳方法是.NET3.5中的System.Linq命名空间我也考虑过LINQtoobjects,但我担心类型化数据模板失去了在列表中显示对象所需的灵活性。如果您现在无法预测人们将如何对您的对象集合进行排序和过滤,那么您应该查看SystemThe.Linq.Expressionsnamespacebuildsyourlambdaexpressionsasneeded在运行时(首先让用户构建表达式,然后编译、运行,最后使用反射命名空间枚举结果)。围绕它更棘手,但无价的功能,可能(最终)比LINQ本身更具开创性。更新:我找到了一个更优雅的解决方案:classMyCompositeObject{DateTimeCreatedDate;字符串SomeAttribute;对象Obj1;{classMyCompositeObjects:List{}我发现由于反射,Obj1中存储的特定类型在运行时被解析,并按预期应用了DataTemplate的特定类型!以上就是《C#学习教程:复合集合排序》的全部内容并分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: