2010-04-09 45 views
2

當組合列表時,我有點特殊要求。我會試着用一個例子來說明。假設我正在處理2個GamePlayer對象列表。 GamePlayer有一個名爲LastGamePlayed的屬性。一個獨特的GamePlayer通過GamePlayer.ID屬性被識別。現在我想將listA和listB組合到一個列表中,如果兩個列表中都有一個給定的玩家,我想保留listA的值。結合列表,但獲得唯一成員

我不能只是將列表和使用比較器,因爲我的唯一性是基於ID,如果我的比較器檢查ID,我將無法控制它是否選擇listA或listB的元素。我需要這樣的東西:

for each player in listB 
{ 
    if not listA.Contains(player) 
    { 
     listFinal.Add(player) 
    } 
} 

然而,有沒有做到這一點,而不是在數組listB每個元素搜索的listA的更優化的方法嗎?

****編輯****:或者,如果我想根據LastGamePlayed的值選擇保留哪個GamePlayer(而不是知道ListA優先於ListB)?所以我想要一個獨特的GamePlayer對象列表,但是對於每個玩家我想要GamePlayer對象與最近的LastGamePlayed?基本上我需要一種方法來確定當有重複的GamePlayers時要保留哪個對象。

+0

listFinal是否包含listA中不存在的所有listA和listB中的所有項目? – Thomas 2010-04-09 02:19:36

回答

1

現在,這已經澄清,這個問題基本上是這樣的:

  • 將所有元素從名單A和名單B,如果有任何重複,保持一個與最新LastGamePlayed

我將與一組這樣做:

var players = from p in listA.Concat(listB) 
       group p by p.ID into g 
       select g.OrderByDescending(x => x.LastGamePlayed).First(); 

如果性能是一個問題,還有「快」的方式來寫這篇文章,但我會用這個開始。

2

你應該可以使用linq枚舉擴展Concat和Exept來實現這一點。

listA.Concat(listB.Except(listA的);

這將消除在B匹配一個的項目,並將其結果添加到A.

你將不得不寫的IEqualityComparer其中比較通過ID

對論文方法

文檔可以在這裏找到:

MSDN Enumerable Extensions

IEqualityComp arer文檔可以在這裏找到:

MSDN IEqualityComparer

0

你可以寫一個O從list2中建立了一套則覆蓋(或插入)項目與列表1,然後將那組回(N log n)的解決方案名單。

如果列表已經排序,您可以通過手動合併來完成O(n)操作。