向已排序的可观察集合添加项

本文关键字:集合 添加 观察 排序 | 更新日期: 2023-09-27 18:12:49

我有一个需要按日期排序的项目列表,所以我正在做的是以下操作(我将ItemsControl绑定到Pushes:

public ObservableCollection<Push> Pushes
        {
            get { return Settings.PushCol; }
            set { Settings.PushCol = value; OnPropertyChanged("Pushes"); }
        }

    Pushes = new ObservableCollection<Push>(
        Settings.PushCol
            .Where(push => push.Active == true)
            .OrderByDescending(push => push.Created)
    );

这里的问题是,如果我要添加到Pushes,我将不得不使用上面的代码求助于我的Pushes,这导致的问题是,如果我有一个大的集合,它将冻结UI,直到集合被更新。

我正试图找到一个更好的方法来做到这一点,谁能告诉我这里的最佳实践是什么?

向已排序的可观察集合添加项

首先,不要在列表中使用set字符。这样,您就可以控制如何将项目添加到列表中。

有很多方法可以通过CollectionViewSource对ObservableCollection进行排序。你可以在这里读到。

另一个解决方案是将列表公开为IEnumerable<Push>

public IEnumerable<Push> Pushes // no Add method on IEnumerable
{
    get { return Settings.PushCol; }
}

然后在你的类中实现一个Add方法,它控制项目的添加方式。

public void Add(Push p){
    int i = 0;
    for (; i < Settings.PushCol.Count; i++)
    {
        if (Settings.PushCol[i].Created > p.Created)
            break;
    }
    Settings.PushCol.Insert(i, p);
}
public static class ObservableCollectionExtensions
{
    /// <summary>
    /// Sorted add for observable collection using custom comparer
    /// </summary>
    public static void AddSorted<T>(this ObservableCollection<T> collection, T item, IComparer<T> comparer)
    {
        var sortableList = new List<T>(collection);
        int index = sortableList.BinarySearch(item, comparer);
        if (index < 0)
            index = ~index;
        collection.Insert(index, item);
    }
}