for WPF developers
Home Profile Tips 全記事一覧

Single 拡張メソッドでシーケンス内の唯一な要素を取得する

(2017/03/14 10:49:36 created.)

(2017/03/14 11:45:30 modified.)

Single 拡張メソッドは、シーケンスの長さが 1 の場合にはその要素を返し、そうでない場合には例外を発生させます。

Program.cs
  1. namespace Tips_Linq
  2. {
  3.     using System;
  4.     using System.Linq;
  5.  
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             try
  11.             {
  12.                 var number = Enumerable.Range(1, 1);
  13.                 // シーケンスに要素がひとつしかないのでその要素が得られる
  14.                 Console.WriteLine(number.Single());
  15.  
  16.                 var numbers = Enumerable.Range(1, 3);
  17.                 // シーケンスに条件を満たす要素がひとつしかないのでその要素が得られる
  18.                 Console.WriteLine(numbers.Single(x => x == 2));
  19.  
  20.                 // シーケンスに要素が複数あるため例外が発生する
  21.                 Console.WriteLine(numbers.Single());
  22.             }
  23.             catch (Exception ex)
  24.             {
  25.                 Console.WriteLine(ex);
  26.             }
  27.  
  28.             Console.ReadKey();
  29.         }
  30.     }
  31. }


入力引数に Func<TSource, bool> 型のデリゲートを指定することで、true が返るような要素が唯一かどうかを調べることができます。

唯一な要素でない場合に例外を発生させたくない場合は SingleOrDefault 拡張メソッドを使用しましょう。