2015-09-09 109 views
7

想象我有一個項目列表:在列表複製更改

 
- A 
- B 
- C 

現在從某處的服務器告訴我的應用程序,元素B被刪除,但它僅提供了全新的列表,而不是確切的變化細節。由於WinRT ListView可自動添加,移除和移動項目內的項目,所以我寧願不刷新支持列表並調用Reset- INotifyCollectionChanged -event,因爲這會激發每個項目看起來相當鈍和粗糙。 相反,我想計算將本地列表轉換爲從服務器獲取的列表所需的步驟。 (有點像levenshtein距離,只是沒有臺階數,而是有臺階本身)

e。 g .:

 
1. Delete element B 
2. Add new element D to position 3 

我該怎麼做?

編輯:訂購事項在我的情況。

+2

你可以看看差異算法 - https://en.wikipedia.org/wiki/Diff_utility –

回答

3

根據@MihaiCaracostea建議的頁面標題,我找到了一種適用於任何IList<T>的工作差異算法。它甚至使用yield來計算差異,因爲你列舉了這些變化。

該文章可以找到here,實際的源代碼(如果你不想看它是如何完成的)是here

請注意,算法運行在O(n²)時間。該領域當然有改進的餘地。

+1

非常好的帖子,隊友! –

+0

@MihaiCaracostea是的,這是一個時刻,當問題和答案都值得upvoting :) –

+0

我目前把所有的代碼(包括一些其他方法轉換成另一個列表)到NuGet庫。完成後我會在這裏發佈鏈接。 –

2

查找初始列表中不存在於收到列表中的元素:刪除它們。

在初始列表中查找接收列表中的元素:添加它們。

編輯:看看this codeproject resource,顯示一個差異算法。

+0

只要順序無關緊要,這就行得通了。 –

+0

順序對我來說很重要。 –

+0

@NeoLegends請參閱編輯中的鏈接。 –