2012-09-14 41 views
2

假設我有一個列表:如何整理清單<Entity>?

MyList = new List<MyEntity>(); 

然後我試着項目添加到列表中。 WCF RIA服務通過異步調用加載的每個項目。 我想MyList總是按MyEntity的屬性排序,說它是ID,添加任何新項目後,

如何解決此問題?

+2

[你有什麼嘗試](http://whathaveyoutried.com)? – Oded

+0

'MyEntity'是什麼樣的?它的定義是什麼? – gideon

+0

尚未嘗試。因爲我無法控制異步完成的順序,所以順序是隨機的。每次運行應用程序時,用戶都會在UI中獲得不同的順序。 – KentZhou

回答

2

您可以使用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 
+0

更改類型也需要更改UI中的數據綁定。更簡單的解決方案? – KentZhou

+0

@KentZhou在這種情況下,你的名單有多大?你願意給你低效的解決方案嗎? – svick

+0

另外SortedSet不適用於Sliverlight。 – KentZhou

1

List<T>不是一個有序的容器,並保持有序的通過調用排序後插入是不是最好的辦法做到這一點。使用由定義排序,而不是一個容器,如基於樹集合或SortedSet

2

您可以使用

Mylist.Sort(); 

MyList.OrderBy(); 

也許後者將是你最好指定屬性

MyList.OrderBy(x => x.ID); 

正如其他人所說,這不是高效的SortedSet將是更好的選擇,但如果改變類型不是一種選擇,那麼這是一種可能性。

1

如果使用列表<實體>集合非常重要,那麼您可以使用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>,則可以避免它。

請注意,Insert語句效率相當低,期望性能如O(n/2)。

希望這會幫助你在你的追求。