C# 在int List中插入值并对列表排序的最快方法

C# 在int List中插入值并对列表排序的最快方法,c#,linq,collections,C#,Linq,Collections,我正在使用动态int通用列表。我正在尝试添加列表,然后按降序排序。此操作发生的时间为若干次。 目前我正在使用Linq来完成这项工作 list.Add(b); list = list.OrderByDescending(i => i).ToList(); 是否有某种方法可以整体提高此操作的性能。您当前的方法是次优的,因为每次添加元素时,您都在对整个列表进行排序,这是可以避免的,而每次向列表添加整数时,您都在构建一个新的列表,这也是可以避免的 由于您已经有了一个列表,我将使用属于此类的方法,

我正在使用动态int通用列表。我正在尝试添加列表,然后按降序排序。此操作发生的时间为若干次。 目前我正在使用Linq来完成这项工作

list.Add(b);
list = list.OrderByDescending(i => i).ToList();
是否有某种方法可以整体提高此操作的性能。

您当前的方法是次优的,因为每次添加元素时,您都在对整个列表进行排序,这是可以避免的,而每次向
列表添加整数时,您都在构建一个新的列表,这也是可以避免的

由于您已经有了一个
列表
,我将使用属于此类的方法,而不是使用LINQ来避免开销

我建议创建这样一个扩展方法:

public static class Extensions {
        public static void InsertElementDescending(this List<int> source, 
                int element)
        {
            int index = source.FindLastIndex(e => e > element);
            if (index == 0 || index == -1)
            {
                source.Insert(0, element);
                return;
            }
            source.Insert(index + 1, element);
        }
}
公共静态类扩展{
公共静态void InsertElementDescending(此列表源,
int元素)
{
int index=source.findlastinex(e=>e>element);
如果(索引==0 | |索引==-1)
{
来源。插入(0,元素);
返回;
}
来源.插入(索引+1,元素);
}
}
那么用例将是:

List<int> list = new List<int>();

list.InsertElementDescending(1);
list.InsertElementDescending(2);
list.InsertElementDescending(233);
list.InsertElementDescending(0);
list.InsertElementDescending(-2);
List List=新列表();
列表。插入项(1);
列表。插入项(2);
列表.插入项下降(233);
list.InsertElementDescending(0);
列表。插入元素降序(-2);
列表中的元素现在将按降序排列


总的来说,这比您当前的方法有更好的性能。

您的方法确实有很多开销,因为每次插入时都会创建一个新的
列表

您可以通过就地排序来加快速度。考虑到在原始预排序列表后面添加项之后,您需要做的就是将该项移回,直到您命中的项目大于新插入的项。您可以这样做:

static void InsertSorted<T>(IList<T> list, T item) where T : IComparable<T> {
    list.Add(item);
    var i = list.Count-1;
    for ( ; i > 0 && list[i-1].CompareTo(item) < 0 ; i--) {
        list[i] = list[i-1];
    }
    list[i] = item;
}
静态void InsertSorted(IList列表,T项),其中T:IComparable{
列表。添加(项目);
var i=list.Count-1;
对于(;i>0&&list[i-1]。比较(项)<0;i--){
列表[i]=列表[i-1];
}
列表[i]=项目;
}

您可以使用
SortedDictionary
SortedSet
或SortedList。。。只有在没有重复值的情况下,SortedSet才会有帮助。@ZoharPeled
SortedList
也不允许重复。