找出两个System.Collections.Generic.Lists的不同之处
本文关键字:Lists Generic Collections System 两个 | 更新日期: 2023-09-27 17:51:02
我有一个System.Collections.Generic.List
的本地副本,它由相同类型的服务器列表填充。当服务器列表发生更改时(一个项目被添加到列表中或从列表中删除),我的应用程序会收到通知。
作为对该通知的响应,我想更新列表的本地副本。我不想清除本地副本并将其完全替换为服务器副本。我想找出差异,删除已删除的,添加已添加的。
最好的方法是什么?
是否可以通过一些键来识别每个项目?如果是这样,那么您可以保存一个键到项的字典,当您从服务器获得更新后的列表时,您可以在字典中查找每个键并删除/更新相应的项。
要允许从列表中删除项,可以将整个服务器数据复制到另一个字典中,并查询本地列表中的每个项。
此解的复杂度为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);