我有System.Collections.Generic.List
的本地副本,该副本由相同类型的服务器列表填充。当服务器列表更改(项目添加到列表或从列表中删除)时,我的应用程序会收到通知。
为响应该通知,我想更新列表的本地副本。我不想清除本地副本并将其完全替换为服务器副本。我想找到差异并删除已删除的内容并添加已添加的内容。
最好的技术是什么?
答案 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);