我正在尝试使用"联盟"合并2个列表,因此我摆脱了重复.以下是示例代码:
public class SomeDetail
{
public string SomeValue1 { get; set; }
public string SomeValue2 { get; set; }
public string SomeDate { get; set; }
}
public class SomeDetailComparer : IEqualityComparer<SomeDetail>
{
bool IEqualityComparer<SomeDetail>.Equals(SomeDetail x, SomeDetail y)
{
// Check whether the compared objects reference the same data.
if (Object.ReferenceEquals(x, y))
return true;
// Check whether any of the compared objects is null.
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
return x.SomeValue1 == y.SomeValue1 && x.SomeValue2 == y.SomeValue2;
}
int IEqualityComparer<SomeDetail>.GetHashCode(SomeDetail obj)
{
return obj.SomeValue1.GetHashCode();
}
}
List<SomeDetail> tempList1 = new List<SomeDetail>();
List<SomeDetail> tempList2 = new List<SomeDetail>();
List<SomeDetail> detailList = tempList1.Union(tempList2, SomeDetailComparer).ToList();
Run Code Online (Sandbox Code Playgroud)
现在问题是我可以使用Union并仍然获得具有最新日期的记录(使用SomeDate属性).记录本身可以在tempList1或tempList2中.
提前致谢
真正适合此目的的操作是完全外连接.该Enumerable
班有内实现连接,你可以用它来寻找重复的,并选择你喜欢哪个.
var duplicates = Enumerable.Join(tempList1, tempList2, keySelector, keySelector,
(item1, item2) => (item1.SomeDate > item2.SomeDate) ? item1 : item2)
.ToList();
Run Code Online (Sandbox Code Playgroud)
keySelector
只是一个函数(可能是一个lambda表达式),它从类型的对象中提取一个键SomeDetail
.现在,要实现完整的外连接,请尝试以下方法:
var keyComparer = (SomeDetail item) => new { Value1 = item.SomeValue1,
Value2 = item.SomeDetail2 };
var detailList = Enumerable.Union(tempList1.Except(tempList2, equalityComparer),
tempList2.Except(tempList1, equalityComparer)).Union(
Enumerable.Join(tempList1, tempList2, keyComparer, keyComparer
(item1, item2) => (item1.SomeDate > item2.SomeDate) ? item1 : item2))
.ToList();
Run Code Online (Sandbox Code Playgroud)
equalityComparer
应该是一个实现IEqualityComparer<SomeDetail>
并有效使用该keyComparer
函数来测试相等性的对象.
如果能为您完成这项工作,请告诉我.