比较两个列表<> 在 C# 上

本文关键字:列表 两个 比较 | 更新日期: 2023-09-27 18:35:49

我的问题是这样的:C# 列表比较

但唯一需要注意的是:

我正在使用.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.

谢谢和亲切的问候。

比较两个列表<> 在 C# 上

对于您在计算交集时链接到的问题,您需要实现自己的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;
}

您可能应该在上面添加一些错误处理(第一个不是空的,第二个不是空的)。请注意,由于使用的是 .NET 2.0,因此无法使用HashSet<T>

如果要

检查列表是否包含相同的项目(即相同顺序的相同项目):

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;
}

Leandro,

你也可以使用我的开源比较.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);
}