c# - 当我得到 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);
}
}
解决方案
如果要将其插入正确的位置,则有三个选项:
- 找到正确的位置,然后
Insert
它就在那里 - 使用预先排序的列表,例如
SortedList<TKey,TValue>
orSortedSet<T>
(取决于您的需要)并添加(注意:SortedList<TKey,TValue>
要求唯一键;SortedSet<T>
应用唯一值) - 只是
AddRange()
第二个列表并Sort()
再次调用
“1”的问题在于有效地为每个新元素找到正确的位置是很尴尬的。如果这是一个数组,您可以使用对于 1,您希望使用Array.BinarySearch
- 如果未找到匹配项,则返回相应索引的按位补码。您可以手动实现二进制搜索List<T>
,但是..这并不有趣。BinarySearch
列表中存在的哪个(感谢@mjwills),注意找不到匹配项时的返回值是一个按位补码,告诉您在哪里插入它。但是您仍然需要为每个元素执行此操作,这会加起来。
就个人而言,我会被诱惑SortedSet<T>
或只是调用AddRange()
+Sort()
List<T>