0

私の質問はこのようなものです: c#リスト比較

しかし、注意すべきことはこれだけです:

.NETFramework2.0を使用しています

では、C#フレームワーク2で2つのリストを比較し、項目が異なる場合にブール値を返すにはどうすればよいですか?

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

編集:

どちらもリストです

編集2

リストの値が正確かどうかを比較しようとしています。私はそれらをソートすることができます、そのためのnp。問題は、アイテムの数または値が変更されたかどうかです。例えば:

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.

よろしくお願いします。

4

3 に答える 3

5

交差の計算にリンクする質問については、独自のバージョンの を実装する必要があります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;
}

おそらく、上記に何らかのエラー処理を追加する必要があります (最初は null ではなく、2 番目は null ではありません)。HashSet<T>.NET 2.0 を使用しているため、使用できないことに注意してください。

于 2012-05-31T14:01:58.957 に答える
4

リストに同一のアイテムが含まれているかどうか (つまり、同じアイテムが同じ順序で並んでいるかどうか) を確認するには:

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;
}
于 2012-05-31T14:03:09.057 に答える
1

レアンドロ

私のオープン ソースの Compare .NET Objects Library を使用することもできます。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);

}
于 2014-08-27T19:32:57.437 に答える