找出两个System.Collections.Generic.Lists的项目的差异

时间:2014-03-20 11:12:12

标签: c# wpf list generics

我有System.Collections.Generic.List的本地副本,该副本由相同类型的服务器列表填充。当服务器列表更改(项目添加到列表或从列表中删除)时,我的应用程序会收到通知。

为响应该通知,我想更新列表的本地副本。我不想清除本地副本并将其完全替换为服务器副本。我想找到差异并删除已删除的内容并添加已添加的内容。

最好的技术是什么?

3 个答案:

答案 0 :(得分:2)

是否可以通过某些键识别每个项目?如果是这样,那么您可以从一个项目到另一个项目保存一个字典,当您从服务器获得更新列表时,您可以查找字典中的每个键并删除/更新相应的项目。

要启用从列表中删除项目,您可以将整个服务器数据复制到另一个字典中,并查询本地列表中的每个项目。

此解决方案的复杂性为O(n),而不是在列表上使用Except,这将是O(n ^ 2)。

答案 1 :(得分:1)

如果通知包含整个远程列表,您可以使用Linq的Except

List<int> localList = new List<int>() {1, 2, 3};
List<int> remoteList = new List<int>() {1, 2, 4};

var addedItems = remoteList.Except(localList);
var removedItems = localList.Except(remoteList);

答案 2 :(得分:1)

可以使用LINQ

完成
    string[] names1 = System.IO.File.ReadAllLines(@"../../../names1.txt");
    string[] names2 = System.IO.File.ReadAllLines(@"../../../names2.txt");

    // Create the query. Note that method syntax must be used here.
    IEnumerable<string> differenceQuery =
      names1.Except(names2);

    // Execute the query.
    Console.WriteLine("The following lines are in names1.txt but not names2.txt");
    foreach (string s in differenceQuery)
        Console.WriteLine(s);