for WPF developers
Home Profile Tips 全記事一覧

SequenceEqual 拡張メソッドで 2 つのシーケンスが等しいかどうかを判定する

(2017/03/14 10:48:12 created.)

SequenceEqual 拡張メソッドでは、2 つのシーケンスのすべての要素が等しいかどうかを判定し、1 つでも異なる要素があったり、シーケンスの長さが異なったりする場合は false を返します。

ILSpy を用いた結果(を若干修正したもの)を以下に示します。このコードを見ただけで何をやっているかはだいたいわかりますね。第 2 引数に等値比較子を指定しない場合は、比較するクラスのデフォルトの等値比較子が使用されるようになっています。独自のクラスの比較をおこなうような場合などに指定しましょう。等値比較子については「Contains 拡張メソッドで指定した要素が含まれているかどうかを確認する」や「Distinct 拡張メソッドで重複する要素をシーケンスから除外する」などを参照してください。

ILSpy による逆コンパイル結果
  1. public static bool SequenceEqual<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second)
  2. {
  3.     return first.SequenceEqual(second, null);
  4. }
  5.  
  6. public static bool SequenceEqual<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)
  7. {
  8.     if (comparer == null)
  9.     {
  10.         comparer = EqualityComparer<TSource>.Default;
  11.     }
  12.     if (first == null)
  13.     {
  14.         throw new ArgumentNullException("first");
  15.     }
  16.     if (second == null)
  17.     {
  18.         throw new ArgumentNullException("second");
  19.     }
  20.     using (IEnumerator<TSource> enumerator = first.GetEnumerator())
  21.     {
  22.         using (IEnumerator<TSource> enumerator2 = second.GetEnumerator())
  23.         {
  24.             while (enumerator.MoveNext())
  25.             {
  26.                 if (!enumerator2.MoveNext() || !comparer.Equals(enumerator.Current, enumerator2.Current))
  27.                 {
  28.                     bool result = false;
  29.                     return result;
  30.                 }
  31.             }
  32.             if (enumerator2.MoveNext())
  33.             {
  34.                 bool result = false;
  35.                 return result;
  36.             }
  37.         }
  38.     }
  39.     return true;
  40. }