C# 我如何比较两个列表并将其匹配

C# 我如何比较两个列表并将其匹配,c#,asp.net-mvc,linq,list,comparison,C#,Asp.net Mvc,Linq,List,Comparison,我有两个列表,一个是主数据,另一个是错误的数据。现在我想比较一下这个列表,把错误的和正确的匹配起来 public class Data { public int Id { get; set; } public string Text{ get; set; } } var masterList = new List<Data> { new Data { id = 1, Text = "Hello" }, new Data() {id = 2, Text ="Ciao

我有两个列表,一个是主数据,另一个是错误的数据。现在我想比较一下这个列表,把错误的和正确的匹配起来

 public class Data
{
    public int Id { get; set; }
    public string Text{ get; set; }
}

var masterList = new List<Data> { new Data { id = 1, Text = "Hello" }, new Data() {id = 2, Text ="Ciao"} };
var wrongList = new List<Data> { new Data { id = 1, Text = "Ciao" }, new Data() {id = 2, Text ="Morning"} };
公共类数据
{
公共int Id{get;set;}
公共字符串文本{get;set;}
}
var masterList=new List{new Data{id=1,Text=“Hello”},new Data(){id=2,Text=“Ciao”};
var errollist=new List{new Data{id=1,Text=“Ciao”},new Data(){id=2,Text=“Morning”};
现在在主列表中,id为1的文本是“你好”,而在错误列表中,id为1的文本是“再见”

但是id为2的文本有文本“Hello”,所以我如何匹配这两个列表,当列表中有匹配项时,我如何将正确的文本匹配到正确的id

如果文本匹配,则我将有一个新列表,如下所示:

id=2,Text=“Ciao”

我希望你能理解我的问题


感谢您的帮助……

您可以使用linq和
Intersect
轻松完成此操作,并使
数据
实现
IEquatable

更新:根据评论,这里是一个实现
IEqualityComparer的解决方案

类数据比较器:IEqualityComparer
{
//如果数据的名称和Id相等,则它们相等。
公共布尔等于(数据x,数据y)
{
if(ReferenceEquals(x,y))
返回true;
if(ReferenceEquals(x,null)||
ReferenceEquals(y,null))
返回false;
返回x.Id==y.Id&&x.Text==y.Text;
}
public int GetHashCode(数据)
{
if(ReferenceEquals(乘积,null))
返回0;
返回(product.Name==null?0:product.Name.GetHashCode())^product.Code.GetHashCode();
}
}

现在,您只需执行以下操作:
var matches=masertList.Intersect(错误列表,new DataComparer())

给定示例的预期结果我更新了我的问题示例的预期输出只是
主列表的内容。需要进行什么样的比较?@user1861065-现在我更困惑了。@user1861065:
var matches=masterList-像那样?说真的,这里没有逻辑来实现。至少与给出的示例不同。由此我得到以下错误:枚举未产生任何结果,这是因为类默认使用引用相等。由于您的列表包含不同的对象(其中一些对象恰好具有相同的属性值),因此交集将为空。@user1861065
Data
需要根据您的需要实现
IEquatable
。或者,您可以实现自定义的
iequalitycomparer
,并使用相应的
Intersect
重载。
var matches = masertList.Intersect(wrongList);
class DataComparer : IEqualityComparer<Data>
{
    // Datas are equal if their names and Id are equal.
    public bool Equals(Data x, Data y)
    {
        if (ReferenceEquals(x, y))
            return true;

        if (ReferenceEquals(x, null) ||
            ReferenceEquals(y, null))
            return false;

        return x.Id == y.Id && x.Text == y.Text;
    }

    public int GetHashCode(Data data)
    {
        if (ReferenceEquals(product, null))
            return 0;

        return (product.Name == null ? 0 : product.Name.GetHashCode()) ^ product.Code.GetHashCode();
    }
}