C#通用列表联盟问题

Gan*_*sha 8 c# linq generics

我正在尝试使用"联盟"合并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中.

提前致谢

Nol*_*rin 8

真正适合此目的的操作是完全外连接.该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函数来测试相等性的对象.

如果能为您完成这项工作,请告诉我.