190

Equals メソッドでいくつかのコレクションの内容を比較したいと思います。Dictionary と IList があります。これを行う組み込みの方法はありますか?

編集: 2 つの辞書と 2 つの IList を比較したいので、等価の意味は明らかだと思います。2 つの辞書に同じ値にマップされた同じキーが含まれている場合、それらは等しいです。

4

15 に答える 15

197

Enumerable.SequenceEqual

指定された IEqualityComparer(T) を使用して要素を比較することにより、2 つのシーケンスが等しいかどうかを判断します。

リストと辞書を直接比較することはできませんが、辞書の値のリストをリストと比較することはできます

于 2008-09-04T11:22:19.127 に答える
45

他の人が示唆し、指摘しているように、SequenceEqual順序に依存します。これを解決するには、辞書をキー (一意であるため、並べ替えは常に安定しています) で並べ替えてから、 を使用できますSequenceEqual。次の式は、内部順序に関係なく、2 つの辞書が等しいかどうかをチェックします。

dictionary1.OrderBy(kvp => kvp.Key).SequenceEqual(dictionary2.OrderBy(kvp => kvp.Key))

編集: Jeppe Stig Nielsen が指摘したように、一部のオブジェクトにIComparer<T>は と互換性のない がありIEqualityComparer<T>、誤った結果が得られます。IComparer<T>このようなオブジェクトでキーを使用する場合、それらのキーに対して正しいを指定する必要があります。たとえば、文字列キー (この問題が発生する) の場合、正しい結果を得るには次の操作を行う必要があります。

dictionary1.OrderBy(kvp => kvp.Key, StringComparer.Ordinal).SequenceEqual(dictionary2.OrderBy(kvp => kvp.Key, StringComparer.Ordinal))
于 2011-01-11T08:43:57.387 に答える
16

前述のSequenceEqualに加えて、

2 つのリストが同じ長さであり、対応する要素が比較子に従って等しい場合、真です。

(これはデフォルトの比較子、つまりオーバーライドされたものである可能性がありますEquals())

.Net4 には、オブジェクトにSetEqualsがあることに言及する価値があります。ISet

要素の順序および重複する要素を無視します。

したがって、オブジェクトのリストが必要であるが、特定の順序である必要がない場合は、ISet( a のようなHashSet) が正しい選択である可能性があると考えてください。

于 2012-02-19T10:58:05.927 に答える
6

Enumerable.SequenceEqual メソッドを見てください。

var dictionary = new Dictionary<int, string>() {{1, "a"}, {2, "b"}};
var intList = new List<int> {1, 2};
var stringList = new List<string> {"a", "b"};
var test1 = dictionary.Keys.SequenceEqual(intList);
var test2 = dictionary.Values.SequenceEqual(stringList);
于 2008-09-04T11:23:11.010 に答える
5

これはあなたの質問に直接答えているわけではありませんが、MS の TestTools と NUnit の両方が提供しています。

 CollectionAssert.AreEquivalent

これはあなたが望むことをほとんど行います。

于 2012-09-18T03:45:49.857 に答える
4

Enumerable.SequenceEqual メソッドについては知りませんでした (毎日何かを学んでいます....) が、拡張メソッドの使用を提案するつもりでした。このようなもの:

    public static bool IsEqual(this List<int> InternalList, List<int> ExternalList)
    {
        if (InternalList.Count != ExternalList.Count)
        {
            return false;
        }
        else
        {
            for (int i = 0; i < InternalList.Count; i++)
            {
                if (InternalList[i] != ExternalList[i])
                    return false;
            }
        }

        return true;

    }

興味深いことに、SequenceEqual について 2 秒ほど読んだだけで、私が説明した関数を Microsoft が作成したようです。

于 2008-09-04T11:31:09.400 に答える
4

.NET Lacks any powerful tools for comparing collections. I've developed a simple solution you can find at the link below:

http://robertbouillon.com/2010/04/29/comparing-collections-in-net/

This will perform an equality comparison regardless of order:

var list1 = new[] { "Bill", "Bob", "Sally" };
var list2 = new[] { "Bob", "Bill", "Sally" };
bool isequal = list1.Compare(list2).IsSame;

This will check to see if items were added / removed:

var list1 = new[] { "Billy", "Bob" };
var list2 = new[] { "Bob", "Sally" };
var diff = list1.Compare(list2);
var onlyinlist1 = diff.Removed; //Billy
var onlyinlist2 = diff.Added;   //Sally
var inbothlists = diff.Equal;   //Bob

This will see what items in the dictionary changed:

var original = new Dictionary<int, string>() { { 1, "a" }, { 2, "b" } };
var changed = new Dictionary<int, string>() { { 1, "aaa" }, { 2, "b" } };
var diff = original.Compare(changed, (x, y) => x.Value == y.Value, (x, y) => x.Value == y.Value);
foreach (var item in diff.Different)
  Console.Write("{0} changed to {1}", item.Key.Value, item.Value.Value);
//Will output: a changed to aaa
于 2010-04-29T20:26:10.060 に答える
1

コレクションを比較するには、LINQ も使用できます。Enumerable.Intersect等しいすべてのペアを返します。次のように 2 つの辞書を比較できます。

(dict1.Count == dict2.Count) && dict1.Intersect(dict2).Count() == dict1.Count

dict2およびそれ以上のすべてのキーを含めることができるため、最初の比較が必要ですdict1

Enumerable.Exceptと を使用しEnumerable.Unionて、同様の結果につながるバリエーションを考えることもできます。ただし、セット間の正確な違いを判断するために使用できます。

于 2016-09-27T08:43:16.317 に答える
0

いいえ、フレームワークはリストの内容を比較する方法を認識していないためです。

これを見てください:

http://blogs.msdn.com/abhinaba/archive/2005/10/11/479537.aspx

于 2008-09-04T11:20:01.377 に答える
-2

いいえ。コレクション フレームワークには、平等の概念はありません。考えてみれば、主観的でないコレクションを比較する方法はありません。たとえば、IList と Dictionary を比較すると、すべてのキーが IList にある場合、すべての値が IList にある場合、または両方が IList にある場合、それらは等しいでしょうか? これら 2 つのコレクションが何に使用されるかを知らずに比較する明白な方法はないため、汎用の equals メソッドは意味がありません。

于 2008-09-04T11:33:32.657 に答える