いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

Linq入門記-51 (LINQ To Object, SequenceEqual)

今回は、SequenceEqual拡張メソッドについてです。

SequenceEqualは2つのシーケンスが等しいか否かを判別してくれます。
通常、シーケンス同士の比較というのはループで回して全部同じか否かを
確認するのが定石でしたが、これのおかげで一発でかけるようになります。


これまでは、同じような事をしてくれるユーティリティメソッドを作っている人が
多かったのではないでしょうか。


書式は以下の通り。

public static bool SequenceEqual<TSource>(
	this IEnumerable<TSource> first,
	IEnumerable<TSource> second
)

public static bool SequenceEqual<TSource>(
	this IEnumerable<TSource> first,
	IEnumerable<TSource> second,
	IEqualityComparer<TSource> comparer
)


2つ目の書式には、IEqualityComparerが渡せます。
カスタムオブジェクトのシーケンスを比較する際に利用出来ます。


以下、サンプルです。

    #region LinqSamples-48
    public class LinqSamples48 : IExecutable
    {
        class Language
        {
            public string Name { get; set; }
                
            public static Language Create(string name)
            {
                return new Language { Name = name };
            }
        }
        
        class LanguageNameComparer : EqualityComparer<Language>
        {
            public override bool Equals(Language l1, Language l2)
            {
                return (l1.Name == l2.Name);
            }
            
            public override int GetHashCode(Language l)
            {
                return l.Name.GetHashCode();
            }
        }

        public void Execute()
        {
            //
            // SequenceEqual拡張メソッドは、2つのシーケンスが等しいか否かを判別するメソッド。
            //
            // IEqualityComparerを指定できるオーバーロードが存在する.
            //
            var numbers1 = Enumerable.Range(1, 10);
            var numbers2 = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            
            Console.WriteLine("numbers1 eq numbers2 == {0}", numbers1.SequenceEqual(numbers2));
            
            //
            // IEqualityComparer<T>を指定するバージョン.
            //
            var languages1 = new Language[]
                             { 
                                 Language.Create("csharp"), 
                                 Language.Create("visualbasic"), 
                                 Language.Create("java"),
                                 Language.Create("python"),
                                 Language.Create("ruby"),
                                 Language.Create("php")
                             };

            var languages2 = new Language[]
                             { 
                                 Language.Create("csharp"), 
                                 Language.Create("visualbasic"), 
                                 Language.Create("java"),
                                 Language.Create("python"),
                                 Language.Create("ruby"),
                                 Language.Create("php")
                             };

            var languages3 = new Language[]
                             { 
                                 Language.Create("csharp"), 
                                 Language.Create("visualbasic"), 
                                 Language.Create("java"),
                             };
                             
            var comparer = new LanguageNameComparer();
            
            Console.WriteLine(
                    "languages1 eq languages2 == {0}", 
                    languages1.SequenceEqual(languages2, comparer)
            );
            
            Console.WriteLine(
                    "languages1 eq languages3 == {0}", 
                    languages1.SequenceEqual(languages3, comparer)
            );
        }
    }
    #endregion


実行結果は以下の通りです。

  numbers1 eq numbers2 == True
  languages1 eq languages2 == True
  languages1 eq languages3 == False


今回までで、一旦LINQ To Objectは終了です。
次からは、LINQ To Xmlに入門してみます。



================================
過去の記事については、以下のページからご参照下さい。