在int List中插入值然后对列表进行排序的最快方法

时间:2018-05-19 10:00:52

标签: c# linq collections

我正在使用动态int泛型List。我试图添加,然后按降序排序列表。此操作发生多个时间。 目前我正在使用Linq这样做。

QLineEdit

是否有某种方法可以提高整体操作的性能。

2 个答案:

答案 0 :(得分:1)

您当前的方法次优,因为每次添加元素时,您都会再次对整个列表进行排序,这是可以避免的,并且每次向整个列表添加整数时都会构建一个新的列表。 List<int>再次可以避免。

因为你已经有List<int>我使用属于这个类的方法而不是使用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);
        }
}

然后用例将是:

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

list.InsertElementDescending(1);
list.InsertElementDescending(2);
list.InsertElementDescending(233);
list.InsertElementDescending(0);
list.InsertElementDescending(-2);

列表现在将按降序排列元素。

总体而言,这比目前的方法具有更好的性能。

答案 1 :(得分:1)

您的方法确实有很多开销,因为每次插入都会创建一个新的List<T>

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

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;
}

Demo.