比较两个列表<&燃气轮机;关于C#

比较两个列表<&燃气轮机;关于C#,c#,object,arraylist,.net-2.0,C#,Object,Arraylist,.net 2.0,我的问题是这样的: 但唯一需要注意的是: 我正在使用.NETFramework2.0 那么,如何比较C#framework 2上的两个列表,并在项目不同时返回布尔值呢 instance == anotherone fails instance.Equals(anotherone) fails. 编辑: 它们都在列表中 编辑2 我试图比较列表值是否完全相同。我可以对它们进行分类。问题在于项目的计数或值是否发生变化。例如: List1->Item1 = "A" List1->Item

我的问题是这样的:

但唯一需要注意的是:

我正在使用.NETFramework2.0

那么,如何比较C#framework 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.

感谢并致以亲切的问候。

对于您在计算交叉点时链接到的问题,您需要实现自己版本的
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;
}
列表相交(先列表,后列表){
字典潜力=新字典();
foreach(第一个变量项){
添加(项目,项目);
}
列表交点=新列表();
foreach(第二个变量项){
如果(潜在移除(项目)){
添加(项目);
}
}
折返交叉口;
}
若要处理具有相同频率的相同项目,请执行以下操作:

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;
}
bool是一个多重集合(先列表,后列表){
字典计数=新字典();
foreach(第一个变量项){
如果(!counts.ContainsKey(项目)){
计数。添加(项目,0);
}
计数[项目]=计数[项目]+1;
}
foreach(第二个变量项){
如果(!counts.ContainsKey(项目)){
返回false;
}
计数[项目]=计数[项目]-1;
}
foreach(计数中的var条目){
如果(entry.Value!=0){
返回false;
}
}
返回true;
}

您可能应该在上面添加一些错误处理(第一个不为null,第二个不为null)。请注意,由于您使用的是.NET 2.0,因此不能使用
哈希集。

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

public static bool ListsEqual(列表1、列表2){
如果(list1.Count!=list2.Count)返回false;
for(int i=0;i
Leandro

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


什么类型的?您定义的类实例?信息不够,请写更多的细节。您是否关心列表中项目的顺序,或者如果两个列表包含相同的项目,无论顺序如何,两个列表是否相等?我不关心顺序,因为如果需要进行比较,我可以先对它们进行排序。我在查找是否有任何值被添加和/或删除和/或更新为另一个值。@Leandro:不,不要先排序。你把问题从一个
O(n)
复杂性问题变成一个
O(n log n)
复杂性问题。我不确定
Intersect
是他想要的。@Rawling:他链接的问题是问如何计算交集。请注意,我的第二个方法
是ameasmultisets
解决了他关于查看它们是否有相同项目的问题。@Leandro如果这回答了您的问题,您应该单击投票箭头下方的复选标记,选择“为什么要投反对票?”?如果您不解释您认为错误的地方,则无法改进答案。OP指定(不确定是否在您的答案后添加)如果两个列表中的项目顺序不相同,则两个列表相等。为了记录在案,我没有投反对票。对不起,我在答案后指定了“订单详细信息”。我投票赞成,这对我很有用。这个答案可以用:它不是通用的,但我用了它,它很棒。谢谢。
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;
}
[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);

}