繁体   English   中英

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

[英]How to insert multiple objects in sorted C# List by order, when I got CompareTo()

我的家庭作业:我在C#中获得了通用列表,当实现CompareTo()时,我使用List.Sort对它进行了排序。 我有另一个具有相同结构对象的列表,我需要将它们插入到我的第一个排序列表中,而不是将它们添加到列表的末尾, 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);
            }

        }

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

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

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

就个人而言,我会被SortedSet<T>吸引,或者只对List<T>调用AddRange() + Sort()

您可以覆盖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将始终在此处排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM