为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕妹3146593 2022-11-21 22:04:58

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

            }


        }


查看完整描述

2 回答

?
达令说

TA贡献1531条经验 获得超6个赞

您可以重写 List Add 方法并像下面的示例一样进行操作


public class MyClass : IComparable<MyClass>

{

    public string Name

    {

        get;

        set;

    }

    public int Desc

    {

        get;

        set;

    }


    public int CompareTo(MyClass other)

    {

        return Name.CompareTo(other.Name);

    }

}


public class MyList<T> : List<T> where T : IComparable<T>

{

    public new void Add(T item)

    {          

        if (base.Count == 0)

        {

            base.Add(item);

            return;

        }

        if (base[base.Count - 1].CompareTo(item) <= 0)

        {

            base.Add(item);

            return;

        }

        if (base[0].CompareTo(item) >= 0)

        {

            base.Insert(0, item);

            return;

        }

        int index = base.BinarySearch(item);

        if (index < 0)

            index = ~index;

        base.Insert(index, item);

        base.Add(item);

    }

}



   static void Main(string[] args)

    {

        MyClass myClass = new MyClass();

        myClass.Name = "B";

        MyClass myClass1 = new MyClass();

        myClass1.Name = "A";

        MyClass myClass2 = new MyClass();

        myClass2.Name = "C";

        MyClass myClass3 = new MyClass();

        myClass3.Name = "A";

        MyList<MyClass>mylist= new MyList<MyClass>();


        mylist.Add(myClass);

        mylist.Add(myClass1);

        mylist.Add(myClass2);

        mylist.Add(myClass3);

        Console.ReadKey();

    }

mylist 将始终在这里排序。


查看完整回答
反对 回复 2022-11-21
?
慕村225694

TA贡献1577条经验 获得超4个赞

如果要将其插入正确的位置,您有以下三种选择:

  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>


查看完整回答
反对 回复 2022-11-21
  • 2 回答
  • 0 关注
  • 8 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信