LINQ比较两个列表 - 添加新项,删除旧项,保留共同项。

13

我有两个对象A的列表(L1和L2),L1用于保存在它们被更改之前的对象列表(多对多关系)。L2是更改后的关系。我需要保留共同的元素,但添加新的元素并删除不在L2中的元素。我想知道是否有一条LINQ语句可以完成这个操作。如果您需要更多信息,请让我知道。

提前感谢


你不想替换整个列表吗?这样可能会更快。 - recursive
也许我误解了,但您所要求的不就是存储在L2中的对象集吗?举个具体的例子,如果您有以下输入:L1: { 1, 2, 3, 4, 5 } L2: { 2, 3, 5, 7 } 那么期望的结果不就是{ 2, 3, 5, 7 }吗? - Rob H
1
递归:当我需要这样做时,是为了更新一个“ObservableCollection”——您不希望仅因为几行已更改就重新绑定DataGrid中的每个单元格。 - Gabe
是的,但这是针对多对多关系的,我希望能够保留当前的关系而不是清除并创建新的关系。我正在使用Nhibernate和Castle ActiveRecord。 - Gage
3个回答

18

如果我正确理解您的要求,那么这个应该有效:

L1.AddRange(L2.Except(L1));
L1.RemoveAll(item => !L2.Contains(item));

不是一行代码,但足够接近了...


1

或许 Linq 的布尔运算符,如 Intersect(),可以对您有所帮助?


1
这是一条注释,而不是答案。 - Caius Jard

1

尝试像这样做

var a = from ele in list1
        let alleles = list1.Union(list2)
        let deleles = alleles.Except(list1)
        let neweles = alleles.Except(list2)
        select new { DeletedEles = deleles, NewEles = neweles };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接