2015年12月9日水曜日

.Net(VB C#) LINQ
Enumerable.Last メソッド、LastOrDefaultメソッド

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

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

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

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

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

シーケンス(配列やコレクション)から一番最後の要素を取得します。
Lastメソッドは一番最後の要素がなければ(つまりシーケンスにデータがない状態)例外をスローします。
LastOrDefaultメソッドは一番最後の要素がなければデフォルト値(値型なら初期値、参照型なら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}
            }
まずはLastメソッド、LastOrDefaultメソッドを使用して、一番最後の要素を取得します。
一番最後の要素は存在するので、どちらも問題なく取得できます。
【C#】
//Lastメソッドを使用して、一番最後の要素を取得
Fruit fruit1 = fruits.Last();
//出力
Console.WriteLine(fruit1.Name);
//みかん


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

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

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


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

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


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

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


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

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

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

0 件のコメント: