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代码>-像那样?说真的,这里没有逻辑来实现。至少与给出的示例不同。由此我得到以下错误:枚举未产生任何结果,这是因为类默认使用引用相等。由于您的列表包含不同的对象(其中一些对象恰好具有相同的属性值),因此交集将为空。@user1861065Data
需要根据您的需要实现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();
}
}