2 回答
TA贡献1821条经验 获得超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 将始终在这里排序。
TA贡献1880条经验 获得超4个赞
如果要将其插入正确的位置,您有以下三种选择:
找到正确的位置,然后
Insert
它在那里使用预先排序的列表,例如
SortedList<TKey,TValue>
orSortedSet<T>
(取决于您的需要)并添加(注意:SortedList<TKey,TValue>
需要唯一键;SortedSet<T>
应用唯一值)只是
AddRange()
第二个列表,然后Sort()
再次调用
“1”的问题在于,很难有效地为每个新元素找到正确的位置。如果这是一个数组,您可以使用Array.BinarySearch
- 如果未找到匹配项,它会返回相应索引的按位补码。您可以手动实现二进制搜索List<T>
,但是……这并不好玩。对于 1,您希望使用BinarySearch
列表中存在的那个(感谢@mjwills),请注意未找到匹配项时的返回值是一个按位补码,告诉您将其插入何处。但是您仍然需要为每个元素执行此操作,这会加起来。
就个人而言,我会被SortedSet<T>
或只是在AddRange()
Sort()
List<T>
- 2 回答
- 0 关注
- 112 浏览
添加回答
举报