首页 > 解决方案 > 当我得到 CompareTo() 时,如何按顺序在排序的 C# 列表中插入多个对象

问题描述

我的作业任务:我在 C# 中获得了通用列表,我在实现List.Sort时对其进行了排序CompareTo()。我有另一个相同结构对象的列表,我需要将它们插入到我的第一个排序列表中,而不是将它们添加到列表的末尾和再一次List.Sort,而是立即插入排序并在插入后排序列表。我该怎么做?长话短说:我不能使用 SortedList,只能使用通用列表,我不能将我的项目添加到 MyList1 的末尾,然后是 MyList1.Sort() 我的列表看起来像:

List<MyClass> MyList1 = new List<MyClass>():
List<MyClass> MyList2 = new List<MyClass>()
MyList1.Sort();

我需要按照排序顺序MyList2插入的项目。MyList1我的CompareTo()方法,它按两个属性排序:

public int CompareTo(MyClass next)
{
    int pos = String.Compare(this.name, next.name, StringComparison.CurrentCulture);
    if ((this.price < next.price) || ((this.price== next.price) 
         && (pos > 0)))
    {
        return 1;
    }
    else 
    {
        return - 1;
    }
}

我想出了它应该是什么样子,这很好用:

static void Inserting(List<MyClass> List1,
           List<MyClass> List2)
        {

            foreach (var item in List2)
            {
                var i = 0;
                while (i < List1.Count && item.CompareTo(List1[i]) > 0)
                    i++;
                List1.Insert(i, item);
            }

        }

标签: c#listsortinginsertcompareto

解决方案


如果要将其插入正确的位置,则有三个选项:

  1. 找到正确的位置,然后Insert它就在那里
  2. 使用预先排序的列表,例如SortedList<TKey,TValue>or SortedSet<T>(取决于您的需要)并添加(注意:SortedList<TKey,TValue>要求唯一键;SortedSet<T>应用唯一值)
  3. 只是AddRange()第二个列表并Sort()再次调用

“1”的问题在于有效地为每个新元素找到正确的位置是很尴尬的。如果这是一个数组,您可以使用Array.BinarySearch- 如果未找到匹配项,则返回相应索引的按位补码。您可以手动实现二进制搜索List<T>,但是..这并不有趣。对于 1,您希望使用BinarySearch列表中存在的哪个(感谢@mjwills),注意找不到匹配项时的返回值是一个按位补码,告诉您在哪里插入它。但是您仍然需要为每个元素执行此操作,这会加起来。

就个人而言,我会被诱惑SortedSet<T>或只是调用AddRange()+Sort()List<T>


推荐阅读