首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找两个System.Collections.Generic.Lists的项的差异

查找两个System.Collections.Generic.Lists的项的差异
EN

Stack Overflow用户
提问于 2014-03-20 11:12:11
回答 3查看 177关注 0票数 0

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

作为对该通知的回应,我希望更新列表的本地副本。我不想清除本地副本,并将其完全替换为服务器副本。我想找出不同之处,删除被删除的,并添加被添加的。

做这件事最好的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-20 11:17:27

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

代码语言:javascript
运行
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2014-03-20 11:16:54

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2014-03-20 11:20:38

这可以用LINQ来完成

代码语言:javascript
运行
复制
    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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22531142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档