使用新项目对ObservableCollection <T>进行排序的最有效方法

Ste*_*eve 1 c# wpf performance

我有ViewModel类如下:

public class ListViewModel
{
    public ObservableCollection<InfoItem> List { get; set; }
}

public interface InfoItem
{
  int Reference { get; }
  string Name { get; }
}
Run Code Online (Sandbox Code Playgroud)

该集合按名称排序,该名称将显示在UI中.我有一个场景,其中集合包含几千个项目,我在集合中添加了一个新项目.

按名称重新排序我的集合的最有效方法是什么,以便新项目出现在列表中的正确位置?

Jon*_*eet 7

如果您的集合已经排序,则对其执行二进制搜索以找出应插入新项目的位置,然后调用Insert.将项目添加到最后然后使用整个集合将非常浪费.

很遗憾没有通用的BinarySearch扩展方法IList<T>,但写起来不应该太难.假设你想要写一个通用的方法来做到这一点(我会建议你做-它不会比写一个显著困难InfoItem特异性之一)你要么想采取IComparer<T> 投影,如

public static int BinarySearch<T>(this IList<T> source, IComparer<T> comparer)
Run Code Online (Sandbox Code Playgroud)

要么

public static int BinarySearch<TSource, TKey>(
    this IList<TSource> source,
    Func<TSource, TKey> keySelector)
Run Code Online (Sandbox Code Playgroud)

我建议你使返回值遵循约定List<T>.BinarySearch,这样如果找不到匹配,它将返回项目将被插入的索引的按位否定.