找出两个System.Collections.Generic.Lists的不同之处

本文关键字:Lists Generic Collections System 两个 | 更新日期: 2023-09-27 17:51:02

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

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

最好的方法是什么?

找出两个System.Collections.Generic.Lists的不同之处

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

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

此解的复杂度为O(n),而在列表上使用Except则为O(n^2)。

如果通知包含整个远程列表,您可以使用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);

可以用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);