【问题标题】:Compare two List<> on C#比较 C# 上的两个 List<>
【发布时间】:2012-05-31 13:57:09
【问题描述】:

我的问题是这样的: c# list compare

但唯一需要注意的是:

我正在使用 .NET Framework 2.0

那么如何比较 C# 框架 2 上的两个列表并在项目不同时返回布尔值?

instance == anotherone fails
instance.Equals(anotherone) fails.

编辑:

它们都是列表

编辑 2

我正在尝试比较列表值是否准确。我可以对它们进行排序,为此。问题是项目的计数或值是否发生变化。例如:

List1->Item1 = "A"
List1->Item2 = "B"

List2->Item1 = "B"
List2->Item2 = "A"

//must return true


List1->Item1 = "A"
List1->Item2 = "B"

List2->Item1 = "B"
List2->Item2 = "C"

//must return false

List1->Item1 = "A"
List1->Item2 = "B"

List2->Item1 = "B"
List2->Item2 = "A"
List2->Item3 = "A"

//must return false, etc.

感谢和亲切的问候。

【问题讨论】:

  • 有哪些类型?你定义的类实例?资料不够,请写详细点
  • 您是否关心列表中项目的顺序,或者如果它们包含相同的项目,两个列表是否相等,无论顺序如何?
  • 我不在乎顺序,因为如果需要比较,我可以先对它们进行排序。我正在寻找是否有任何被添加和/或删除和/或更新为另一个值。
  • @Leandro:不,不要事先排序。您将问题从O(n) 复杂性之一转变为O(n log n) 复杂性之一。

标签: c# object arraylist .net-2.0


【解决方案1】:

对于计算交集时链接到的问题,您需要实现自己的Intersect 版本。这应该可以帮助您开始:

List<T> Intersect<T>(List<T> first, List<T> second) {
    Dictionary<T, T> potential = new Dictionary<T, T>();
    foreach (var item in first) {
        potential.Add(item, item);
    }
    List<T> intersection = new List<T>();
    foreach (var item in second) {
        if (potential.Remove(item)) {
            intersection.Add(item);
        }
    }
    return intersection;
}

处理它们是否具有相同频率的相同项目:

bool AreSameAsMultiSets(List<T> first, List<T> second) {
    Dictionary<T, int> counts = new Dictionary<T, int>();     
    foreach (var item in first) {
        if (!counts.ContainsKey(item)) {
            counts.Add(item, 0);
        }
        counts[item] = counts[item] + 1;
    }
    foreach (var item in second) {
        if (!counts.ContainsKey(item)) {
            return false;
        }
        counts[item] = counts[item] - 1;
    }
    foreach (var entry in counts) {
        if (entry.Value != 0) {
            return false;
        }
    }
    return true;
}

您可能应该在上面添加一些错误处理(第一个不为空,第二个不为空)。请注意,您不能使用 HashSet&lt;T&gt;,因为您使用的是 .NET 2.0。

【讨论】:

  • 我不确定Intersect是他想要的。
  • @Rawling:他链接到的问题是如何计算交集。请注意,我的第二种方法AreSameAsMultiSets 解决了他关于查看它们是否具有相同项目的问题。
  • @Leandro 如果这回答了您的问题,您应该点击投票箭头下方的复选标记“mark as accepted answer
【解决方案2】:

如果你想检查列表是否包含相同的项目(即相同的项目在相同的顺序):

public static bool ListsEqual<T>(List<T> list1, List<T> list2) {
  if (list1.Count != list2.Count) return false;
  for (int i = 0; i < list1.Count; i++) {
    if (list1[i] != list2[i]) return false;
  }
  return true;
}

【讨论】:

  • 为什么投反对票?如果你不解释你认为错误的地方,它就无法改进答案。
  • OP 指定(不确定是否在您的答案之后添加)如果两个列表具有相同的项目但顺序不同,则它们是相等的。郑重声明,我没有投反对票。
  • 对不起,我在回答后指定了“订单详情”。我投票赞成,对我有用。
  • 这个答案可以用:stackoverflow.com/questions/390900/… 解决,不是通用的,但是我用过,很棒。非常感谢。
【解决方案3】:

莱安德罗,

您也可以使用我的开源比较 .NET 对象库。您可以将 Config.IgnoreCollectionOrder 设置为 true。

https://comparenetobjects.codeplex.com/

[Test]
public void ComparerIgnoreOrderSimpleArraysTest()
{
    var a = new String[] { "A", "E", "F" };
    var b = new String[] { "A", "c", "d", "F" };

    var comparer = new CompareLogic();
    comparer.Config.IgnoreCollectionOrder = true;
    comparer.Config.MaxDifferences = int.MaxValue;

    ComparisonResult result = comparer.Compare(a, b);
    Console.WriteLine(result.DifferencesString);
    Assert.IsTrue(result.Differences.Where(d => d.Object1Value == "E").Count() == 1);
    Assert.IsTrue(result.Differences.Where(d => d.Object2Value == "c").Count() == 1);
    Assert.IsTrue(result.Differences.Where(d => d.Object2Value == "d").Count() == 1);

}

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2013-04-18
    相关资源
    最近更新 更多