c# - 对复合集合进行排序

标签 c# .net wpf data-binding collections

因此 WPF 不支持 CompositeCollections View 的标准排序或过滤行为,那么解决此问题的最佳做法是什么。

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

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

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

然后遍历我的两个对象集合以构建新的复合集合。显然,这是一种蛮力方法,但它会起作用。我将在我的新复合对象集合上获得所有默认 View 排序和过滤行为,并且我能够在其上放置一个数据模板以正确显示我的列表项,具体取决于该复合项中实际存储的类型。

对于以更优雅的方式执行此操作有什么建议?

最佳答案

我还不是很熟悉 WPF,但我认为这是一个关于排序和过滤的问题 List<T>收藏。

(withing having to manually implement sort or filter)

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

使用 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);
};

从列表中获取项目子集合的类似方法。

使用 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);
}

关于c# - 对复合集合进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11288/

相关文章:

c# - Windows Phone 开发 - IsolatedStorage

.net - 说, "Assembly successfully added to the cache"但它不在缓存中

.net - <%# %> 和 <%= %> 有什么区别?

wpf - MVVM 命令后更新 UI 的方式是什么?

c# - LoadFromContext 发生

c# - ASP.NET MVC : Get user id of currently logged in user

java - 现有应用程序从 Cassandra DB 迁移到 Cosmos DB

c# - 如何使 WPF Combobox 的下拉列表保持打开和放置

wpf - WPF 资源中的整数值?

c# - 将数据表转换为列表<T>