2015年12月9日水曜日

.Net(VB C#) LINQ
Enumerable.First メソッド、FirstOrDefaultメソッド

Enumerable.Firstメソッド
【C#】
シーケンスの最初の要素を返します。
public static TSource First<TSource>
    (this IEnumerable<TSource> source)

指定された条件を満たす、シーケンスの最初の要素を返します。
public static TSource First<TSource>
   (this IEnumerable<TSource> source, Func<TSource, bool> predicate)
【VB】
シーケンスの最初の要素を返します。
<ExtensionAttribute>
Public Shared Function First(Of TSource) 
    (source As IEnumerable(Of TSource)) 
    As TSource

指定された条件を満たす、シーケンスの最初の要素を返します。
<ExtensionAttribute>
Public Shared Function First(Of TSource) 
    (source As IEnumerable(Of TSource), predicate As Func(Of TSource, Boolean)) 
    As TSource

Enumerable.FirstOrDefaultメソッド
【C#】
シーケンスの最初の要素を返します。シーケンスに要素が含まれていない場合は既定値を返します。
public static TSource FirstOrDefault<TSource>
    (this IEnumerable<TSource> source)
    
条件を満たす、シーケンスの最初の要素を返します。このような要素が見つからない場合は既定値を返します。
public static TSource FirstOrDefault
    (this IEnumerable<TSource> source, Func predicate)
【VB】
シーケンスの最初の要素を返します。シーケンスに要素が含まれていない場合は既定値を返します。
<ExtensionAttribute>
Public Shared Function FirstOrDefault(Of TSource) 
    (source As IEnumerable(Of TSource)) 
    As TSource

条件を満たす、シーケンスの最初の要素を返します。このような要素が見つからない場合は既定値を返します。
<ExtensionAttribute>
Public Shared Function FirstOrDefault(Of TSource) 
    (source As IEnumerable(Of TSource), predicate As Func(Of TSource, Boolean)) 
    As TSource

シーケンス(配列やコレクションなど)から一番最初の要素を取得します。
Firsttメソッドは一番最初の要素がなければ(つまりシーケンスにデータがない状態)例外をスローします。
FirstOrDefaultメソッドは一番最初の要素がなければデフォルト値(値型なら初期値、参照型ならnull)を返します。

このメソッドは即時実行されます。


テストデータです。
【C#】
private class Fruit
{
    public string Name { get; set; }
    public string Rank { get; set; }
    public decimal Price { get; set; }
}

var fruits = new List<Fruit>()
                {
                    new Fruit(){Name = "りんご", Rank = "A" , Price = 1000 },
                    new Fruit(){Name = "みかん", Rank = "A" , Price = 600 },
                    new Fruit(){Name = "ぶどう", Rank = "B" , Price = 1200 },
                    new Fruit(){Name = "りんご", Rank = "B" , Price = 800 },
                    new Fruit(){Name = "みかん", Rank = "A" , Price = 500 }
                };
【VB】
Private Class Fruit
    Public Property Name As String
    Public Property Rank As String
    Public Property Price As Decimal
End Class

Dim fruits = New List(Of Fruit)() From
            {
                New Fruit() With {.Name = "りんご", .Rank = "A", .Price = 1000},
                New Fruit() With {.Name = "みかん", .Rank = "A", .Price = 600},
                New Fruit() With {.Name = "ぶどう", .Rank = "B", .Price = 1200},
                New Fruit() With {.Name = "りんご", .Rank = "B", .Price = 800},
                New Fruit() With {.Name = "みかん", .Rank = "A", .Price = 500}
            }
まずはFirstメソッド、FirstOrDefaultメソッドを使用して、一番最初の要素を取得します。
一番最初の要素は存在するので、どちらも問題なく取得できます。
【C#】
//Firstメソッドを使用して、一番最初の要素を取得
Fruit fruit1 = fruits.First();
//出力
Console.WriteLine(fruit1.Name);
//りんご


//FirstOrDefaultメソッドを使用して、一番最初の要素を取得
Fruit fruit2 = fruits.FirstOrDefault();
//出力
Console.WriteLine(fruit2.Name);
//りんご
【VB】
'Firstメソッドを使用して、一番最初の要素を取得
Dim fruit1 As Fruit = fruits.First()
'出力
Console.WriteLine(fruit1.Name)
'りんご

'FirstOrDefaultメソッドを使用して、一番最初の要素を取得
Dim fruit2 As Fruit = fruits.FirstOrDefault()
'出力
Console.WriteLine(fruit2.Name)
'りんご
次にリストのデータを削除して、存在しない一番最初の要素を取得してみます。
FirstメソッドはInvalidOperationException例外がスローされるますが、
FirstOrDefaultメソッドでは、参照型の規定値であるnullが返ります。
【C#】
//リストからデータを削除
fruits.Clear();

//Firstメソッドを使用して、一番最初の要素を取得
//例外InvalidOperationExceptionがスローされる 
Fruit fruit1 = fruits.First();


//FirstOrDefaultメソッドを使用して、一番最初の要素を取得
//参照型なのでnullが返る 
Fruit fruit2 = fruits.FirstOrDefault();
//出力
Console.WriteLine(fruit2 == null ? "null" : fruit2.Name);
//null
【VB】
'リストからデータを削除
fruits.Clear()

'Firstメソッドを使用して、一番最初の要素を取得
'例外InvalidOperationExceptionがスローされる 
Dim fruit1 As Fruit = fruits.First()


'FirstOrDefaultメソッドを使用して、一番最初の要素を取得
'参照型なのでnullが返る 
Dim fruit2 As Fruit = fruits.FirstOrDefault()
'出力
Console.WriteLine(If(fruit2 Is Nothing, "nothing", fruit2.Name))
'nothing

Firstメソッド、FirstOrDefaultメソッドには、抽出条件を指定できるオーバーロードメソッドがあります。
抽出条件を指定すると、抽出条件に該当したデータの一番最初の要素を取得できます。
該当するデータがない場合、Firstメソッドは例外をスローし、FirstOrDefaultメソッドは規定値を返します。
【C#】
//Firstメソッドを使用して、抽出条件に該当する一番最初の要素を取得
Fruit fruit1 = fruits.First( itm => itm.Name == "りんご");
//出力
Console.WriteLine("名称={0}, ランク={1}, 値段={2}", fruit1.Name, fruit1.Rank, fruit1.Price.ToString("#,##0"));
//名称=りんご, ランク=A, 値段=1,000


//FirstOrDefaultメソッドを使用して、抽出条件に該当する一番最初の要素を取得
Fruit fruit2 = fruits.FirstOrDefault(itm => itm.Name == "みかん");
//出力
Console.WriteLine("名称={0}, ランク={1}, 値段={2}", fruit2.Name, fruit2.Rank, fruit2.Price.ToString("#,##0"));
//名称=みかん, ランク=A, 値段=600
【VB】
'Firstメソッドを使用して、一番最初の要素を取得
Dim fruit1 As Fruit = fruits.First(Function(itm) itm.Name = "りんご")
'出力
Console.WriteLine("名称={0}, ランク={1}, 値段={2}", fruit1.Name, fruit1.Rank, fruit1.Price.ToString("#,##0"))
'名称=りんご, ランク=A, 値段=1,000

'FirstOrDefaultメソッドを使用して、一番最初の要素を取得
Dim fruit2 As Fruit = fruits.FirstOrDefault(Function(itm) itm.Name = "みかん")
'出力
Console.WriteLine("名称={0}, ランク={1}, 値段={2}", fruit2.Name, fruit2.Rank, fruit2.Price.ToString("#,##0"))
'名称=みかん, ランク=A, 値段=600
※VBの場合、コンパイルオプションで「Option Infer」をONにし、型推論を有効にしてください。

.Net(VB C#) LINQのメソッド一覧

0 件のコメント: