当我得到 CompareTo() 时,如何按顺序在排序的 C# List 中插入多个对象

我的家庭作业任务:我在 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);

            }


        }


慕妹3146593
浏览 90回答 2
2回答

达令说

您可以重写 List Add 方法并像下面的示例一样进行操作public class MyClass : IComparable<MyClass>{&nbsp; &nbsp; public string Name&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; get;&nbsp; &nbsp; &nbsp; &nbsp; set;&nbsp; &nbsp; }&nbsp; &nbsp; public int Desc&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; get;&nbsp; &nbsp; &nbsp; &nbsp; set;&nbsp; &nbsp; }&nbsp; &nbsp; public int CompareTo(MyClass other)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return Name.CompareTo(other.Name);&nbsp; &nbsp; }}public class MyList<T> : List<T> where T : IComparable<T>{&nbsp; &nbsp; public new void Add(T item)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if (base.Count == 0)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; base.Add(item);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if (base[base.Count - 1].CompareTo(item) <= 0)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; base.Add(item);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if (base[0].CompareTo(item) >= 0)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; base.Insert(0, item);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; int index = base.BinarySearch(item);&nbsp; &nbsp; &nbsp; &nbsp; if (index < 0)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; index = ~index;&nbsp; &nbsp; &nbsp; &nbsp; base.Insert(index, item);&nbsp; &nbsp; &nbsp; &nbsp; base.Add(item);&nbsp; &nbsp; }}&nbsp; &nbsp;static void Main(string[] args)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; MyClass myClass = new MyClass();&nbsp; &nbsp; &nbsp; &nbsp; myClass.Name = "B";&nbsp; &nbsp; &nbsp; &nbsp; MyClass myClass1 = new MyClass();&nbsp; &nbsp; &nbsp; &nbsp; myClass1.Name = "A";&nbsp; &nbsp; &nbsp; &nbsp; MyClass myClass2 = new MyClass();&nbsp; &nbsp; &nbsp; &nbsp; myClass2.Name = "C";&nbsp; &nbsp; &nbsp; &nbsp; MyClass myClass3 = new MyClass();&nbsp; &nbsp; &nbsp; &nbsp; myClass3.Name = "A";&nbsp; &nbsp; &nbsp; &nbsp; MyList<MyClass>mylist= new MyList<MyClass>();&nbsp; &nbsp; &nbsp; &nbsp; mylist.Add(myClass);&nbsp; &nbsp; &nbsp; &nbsp; mylist.Add(myClass1);&nbsp; &nbsp; &nbsp; &nbsp; mylist.Add(myClass2);&nbsp; &nbsp; &nbsp; &nbsp; mylist.Add(myClass3);&nbsp; &nbsp; &nbsp; &nbsp; Console.ReadKey();&nbsp; &nbsp; }mylist 将始终在这里排序。

慕村225694

如果要将其插入正确的位置,您有以下三种选择:找到正确的位置,然后Insert它在那里使用预先排序的列表,例如SortedList<TKey,TValue>or&nbsp;SortedSet<T>(取决于您的需要)并添加(注意:SortedList<TKey,TValue>需要唯一键;SortedSet<T>应用唯一值)只是AddRange()第二个列表,然后Sort()再次调用“1”的问题在于,很难有效地为每个新元素找到正确的位置。如果这是一个数组,您可以使用Array.BinarySearch- 如果未找到匹配项,它会返回相应索引的按位补码。您可以手动实现二进制搜索List<T>,但是……这并不好玩。对于 1,您希望使用BinarySearch列表中存在的那个(感谢@mjwills),请注意未找到匹配项时的返回值是一个按位补码,告诉您将其插入何处。但是您仍然需要为每个元素执行此操作,这会加起来。就个人而言,我会被SortedSet<T>或只是在AddRange()Sort()List<T>
打开App,查看更多内容
随时随地看视频慕课网APP