如何比较两个列表并从第一个列表中获取差异?

时间:2015-08-31 17:01:02

标签: c# linq visual-studio collections

我遇到了两个名单的情况。比较两者并在第三个列表中得到结果的正确方法是什么。但这是一个小问题。见下面的例子:

ListOld = {
    [Name=Amit, Class=V, Roll=3],
    [Name=Naveen, Class=V, Roll=3],
    [Name=Sammy, Class=V, Roll=3],
    [Name=Neil, Class=X, Roll=21],
    [Name=John, Class=VI, Roll=63]};

ListNew = {
    [Name=Amit, Class=VI, Roll=13],
    [Name=Naveen, Class=VII, Roll=3],
    [Name=Sammy, Class=V, Roll=3],
    [Name=Sanjay, Class=VIII, Roll=2]};

ResultantList = {
    [Name=Amit, Class=VI, Roll=13],
    [Name=Naveen, Class=VII, Roll=3],
    [Name=Sanjay, Class=VIII, Roll=2]};

在上面的示例中,ListNew有3个更改,即Amit和Naveen中的更新,以及Sanjay作为新成员的更新。

所以在我的查询中,我需要比较列表并想要在第一个列表中选择更新或添加的项目。

我尝试过,Except(),Intersect(),union()和Equality Interfaces但没有成功。请帮助。

1 个答案:

答案 0 :(得分:2)

您可以写IEqualityComparer

来完成
public class SomeClassComparer : IEqualityComparer<SomeClass>
{
    public bool Equals(SomeClass x, SomeClass y)
    {
        return x.Name == y.Name && x.Class == y.Class && x.Roll == y.Roll;
    }

    public int GetHashCode(SomeClass obj)
    {
        return (obj.Name + obj.Class).GetHashCode();
    }
}

现在,linq很简单

var result = ListNew.Except(ListOld , new SomeClassComparer()).ToList();

你也可以通过覆盖ToStringGetHashcode方法来做同样的事情,但IEqualityComparer是好的,特别是当你无法控制你使用的类时。