我想就如何最好地编写一个通用函数来比较两个列表提供一些反馈。列表包含类对象,我们想遍历一个列表,在第二个列表中查找相同的项目并报告任何差异。

我们已经有一个比较类的方法,因此我们需要有关如何从两个列表中提供该方法的反馈(如下所示)。

例如,假设我们有一个简单的“Employee”类,它具有三个属性,即Name,ID和Department。我们要报告List和另一个List之间的差异。

笔记:
两个列表将始终包含相同数量的项目。

如上所述,我们有一个通用方法可用来比较两个类,如何将这种方法结合起来以迎合Lists,即从另一个方法开始,循环遍历List并将类提供给通用方法....但是我们如何在第二个List中找到等效的类传递给下面的方法;

public static string CompareTwoClass_ReturnDifferences<T1, T2>(T1 Orig, T2 Dest)
    where T1 : class
    where T2 : class
{
    // Instantiate if necessary
    if (Dest == null) throw new ArgumentNullException("Dest", "Destination class must first be instantiated.");

    var Differences = CoreFormat.StringNoCharacters;

    // Loop through each property in the destination
    foreach (var DestProp in Dest.GetType().GetProperties())
    {
        // Find the matching property in the Orig class and compare
        foreach (var OrigProp in Orig.GetType().GetProperties())
        {

            if (OrigProp.Name != DestProp.Name || OrigProp.PropertyType != DestProp.PropertyType) continue;
            if (OrigProp.GetValue(Orig, null).ToString() != DestProp.GetValue(Dest, null).ToString())
                Differences = Differences == CoreFormat.StringNoCharacters
                    ? string.Format("{0}: {1} -> {2}", OrigProp.Name,
                                                       OrigProp.GetValue(Orig, null),
                                                       DestProp.GetValue(Dest, null))
                    : string.Format("{0} {1}{2}: {3} -> {4}", Differences,
                                                              Environment.NewLine,
                                                              OrigProp.Name,
                                                              OrigProp.GetValue(Orig, null),
                                                              DestProp.GetValue(Dest, null));
        }
    }
    return Differences;
}

有任何建议或想法吗?

编辑:针对.NET 2.0,因此LINQ毫无疑问。

最佳答案



这是您的实际问题;您必须至少具有一个不可变的属性,一个ID或类似的名称,才能在两个列表中标识相应的对象。如果您没有这样的属性,您将无法解决问题而不会出错。您可以通过搜索最小或逻辑更改来尝试猜测相应的对象。

如果具有这样的属性,则解决方案将变得非常简单。

Enumerable.Join(
   listA, listB,
   a => a.Id, b => b.Id,
   (a, b) => CompareTwoClass_ReturnDifferences(a, b))



现在我很困惑……这是什么问题?为什么不只是以下内容?
for (Int32 i = 0; i < Math.Min(listA.Count, listB.Count); i++)
{
    yield return CompareTwoClass_ReturnDifferences(listA[i], listB[i]);
}

如果保证相等的长度,甚至可以忽略Math.Min()调用。

由于委托(delegate)和使用枚举数而不是使用ICollection,因此Noldorin的实现当然更聪明。

关于c# - 比较两个列表的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/675699/

10-14 14:12
查看更多