19

これを行うには多くの方法がありますが、関数か何かを見逃しているように感じます。

明らかにList == Listを使用Object.Equals()して返しfalseます。

リストのすべての要素が等しく、反対側のリストの同じ場所に存在する場合、それらは等しいと見なします。私は値の型を使用していますが、正しく実装された Data オブジェクトは同じように動作するはずです (つまり、コピーされた浅いリストを探しているのではなく、内部の各オブジェクトの値が同じであることだけを探しているのです)。

検索してみましたが、同様の質問がありますが、私の質問は、すべての要素が正確な順序で等しいことです。

4

6 に答える 6

42
Enumerable.SequenceEqual<TSource>

MSDN

于 2009-05-18T06:58:59.127 に答える
4

邪悪な実装は

if (List1.Count == List2.Count)
{
   for(int i = 0; i < List1.Count; i++)
   {
      if(List1[i] != List2[i])
      {
         return false;
      }
   }
   return true;
}
return false;
于 2009-05-18T06:59:49.327 に答える
3

私はこのバリエーションをまとめました:

private bool AreEqual<T>(List<T> x, List<T> y)
{
    // same list or both are null
    if (x == y)
    {
        return true;
    }

    // one is null (but not the other)
    if (x== null || y == null)
    {
        return false;
    }

    // count differs; they are not equal
    if (x.Count != y.Count)
    {
        return false;
    }

    for (int i = 0; i < x.Count; i++)
    {
        if (!x[i].Equals(y[i]))
        {
            return false;
        }
    }
    return true;
}

私の中のオタクも這い出たので、SequenceEqualsに対してパフォーマンステストを行いましたが、これにはわずかなエッジがあります。

さて、尋ねるべき質問。この小さな、ほぼ測定可能なパフォーマンスの向上は、コードをコードベースに追加して維持する価値がありますか?私はそれを非常に疑っています;o)

于 2009-05-18T07:14:36.370 に答える
2

クイック拡張メソッドをノックアップしました:

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static bool Matches<T>(this List<T> list1, List<T> list2)
        {
            if (list1.Count != list2.Count) return false;
            for (var i = 0; i < list1.Count; i++)
            {
                if (list1[i] != list2[i]) return false;
            }
            return true;
        }
    }   
}
于 2009-05-18T07:03:01.413 に答える