假设我有ListA
objectA
。
objectA
有姓名,年龄,名单,等级
和其他ListB
与objectB
。
objectB
有姓名,年龄
如何比较两个列表并根据名称和年龄筛选出不常见的记录。
答案 0 :(得分:1)
以下是课程样本:
public interface IHaveNameAndAge
{
string Name { get; set; }
int Age { get; set; }
}
public class ObjectA : IHaveNameAndAge
{
public string Name { get; set; }
public int Age { get; set; }
int RollNo { get; set; }
int Rank { get; set; }
}
public class ObjectB : IHaveNameAndAge
{
public string Name { get; set; }
public int Age { get; set; }
}
public class MyEqualityComparer : IEqualityComparer<IHaveNameAndAge>
{
public bool Equals(IHaveNameAndAge x, IHaveNameAndAge y)
{
if (ReferenceEquals(x, y))
return true;
return x.Age == y.Age && String.Equals(x.Name, y.Name, StringComparison.Ordinal);
}
public int GetHashCode(IHaveNameAndAge obj)
{
return obj.Age.GetHashCode() ^ obj.Name.GetHashCode();
}
}
这是测试代码:
var listA = new List<ObjectA>();
listA.Add(new ObjectA() { Name = "A", Age = 20 });
listA.Add(new ObjectA() { Name = "B", Age = 25 });
var listB = new List<ObjectB>();
listB.Add(new ObjectB() { Name = "A", Age = 20 });
listB.Add(new ObjectB() { Name = "C", Age = 29 });
var myComparer = new MyEqualityComparer();
var result = listA.Intersect<IHaveNameAndAge>(listB, myComparer);
您可以根据自己的要求修改此示例。
答案 1 :(得分:0)
这是一个比较不具有共同基类型的不同类型的小技巧。创建一个IEqualityComparer<object>
,例如:
public class DynamicComparer : IEqualityComparer<object>
{
public bool Equals(dynamic x, dynamic y)
{
return x.Name == y.Name && x.Age == y.Age;
}
public int GetHashCode(dynamic obj)
{
return ((string)obj.Name).GetHashCode() * 31
+ ((int)obj.Age).GetHashCode();
}
}
然后你可以这样做:
var filtered = ListA.Intersect(ListB, new DynamicComparer())
.Cast<objectA>().ToList();
工作原理。由于object
是所有类型的通用基本类型,因此IEqualityComparer<object>
适用于不同类型。但是,我们通常无法比较Name
和Age
属性,因为这些属性未在object
中定义。这里的诀窍是编译器允许您在dynamic
方法签名中放置object
代替IEqualityComparer<object>
,并且仍然履行合同。因此,我们可以利用动态运行时来比较objectA
和objectB
类型共有的属性。