检查两个不同的泛型类型列表是否具有相同的元素

时间:2014-01-21 11:27:49

标签: c#

我有两个不是来自同一类型的通用列表,但它们的类型在公共属性中有一些属性(Date_Debut,Date_Fin,NombreJours)。我想检查这两个列表是否具有相同的元素,考虑它们的共同属性。任何建议

2 个答案:

答案 0 :(得分:1)

你可以通过简单的方式或艰难的方式来做到这一点。困难的方法是使用反射来拉取具有相同名称和类型的属性并比较它们的值。说起来并不难,但它涉及的更多,而且更加密集。您也可以使用这两个类手动键入比较。它可以工作,但如果您认为可能有更多的类共享这些属性,则它不可重复使用。

或者您可以共享界面。

public interface ISharedProperty
{
    DateTime Date_Debut {get;set;}
    DateTime Date_Fin {get;set;}
    int NombreJours {get;set;}
}

然后有IEqualityComparer<ISharedProperty>或扩展方法(或两者)

public class SharedPropertyEqualityComparer : IEqualityComparer<ISharedProperty>
{
    public bool Equals(ISharedProperty x, ISharedProperty y)
    {
        // Add some logic to check for x and y null value
        return x.Date_Debut == y.Date_Debut &&
               x.Date_Fin == y.Date_Fin &&
               x.NombreJours == y.NombreJours;
    }

    public int GetHashCode(ISharedProperty x)
    {
        // Left for you to implement
    }
}

您可以在某些集合中使用相等比较器,也可以创建一个以检查是否相等。您可以使用扩展方法来帮助您。

public static bool EqualsTo(this ISharedProperty x, ISharedProperty y)
{
    return new SharedPropertyEqualityComparer().Equals(x, y);
}

// And use your extension method. Class1 and Class2 
// implements ISharedProperty here
Class1 one = /* some value */;
Class2 two = /* some value */;

one.EqualsTo(two);

答案 1 :(得分:0)

var listA = new List<YourType1>();
var listB = new List<YourType2>();

foreach ( var elementA in listA )
{
    if ( listB.Any(elementB => elementA.Date_Debut == elementB.Date_Debut && 
                               elementA.Date_Fin== elementB.Date_Fin && 
                               elementA.NombreJours == elementB.NombreJours ) ) 
    {
        /// elementA and element b is equal
    }
}

如果你不想把条件设置得很长,那么你可以覆盖你的类Equals方法。然后只需使用Equals方法来比较对象。