假设我有一个列表:
MyList = new List<MyEntity>();
然后我尝试将项目添加到列表中。WCF RIA 服务通过异步调用加载的每个项目。我希望 MyList 总是按 MyEntity 的属性排序,比如它的 ID,在添加任何新项目之后,
如何解决这个问题?
假设我有一个列表:
MyList = new List<MyEntity>();
然后我尝试将项目添加到列表中。WCF RIA 服务通过异步调用加载的每个项目。我希望 MyList 总是按 MyEntity 的属性排序,比如它的 ID,在添加任何新项目之后,
如何解决这个问题?
您可以使用SortedSet保持排序
SortedSet<int> x = new SortedSet<int>();
x.Add(5);
x.Add(1);
x.Add(23);
x.Add(51);
foreach (var i in x)
Console.WriteLine(i);
将打印
1
5
23
51
你可以使用
Mylist.Sort();
或者
MyList.OrderBy();
可能后者对您来说会更好地指定一个属性
MyList.OrderBy(x => x.ID);
正如其他人所说,这效率不高, SortedSet 将是更好的选择,但如果更改类型不是一种选择,那么这是一种可能性。
List<T>
不是一个排序的容器,并且通过在插入之后调用排序来保持它的排序并不是最好的方法。改用按定义排序的容器,例如基于树的集合或SortedSet
如果您使用 List<Entity> 集合非常重要,那么您可以使用 BinarySearch 来定位位置。
int index = MyList.BinarySearch(newMyEntity, yourComparer);
if (index < 0)
MyList.Insert(~index, newMyEntity);
else
// An identical item has been found.
yourComparer 是 IComparer<MyEntity> 的一个实例。如果 MyEntity 实现 IComparable<MyEntity> 接口,则可以避免它。
请注意,插入语句的效率相当低,期望像 O(n/2) 这样的性能。
希望这对您的探索有所帮助。