2015年12月11日金曜日

.Net(VB C#) LINQ
Enumerable.Take メソッド

Enumerable.Takeメソッド
【C#】
シーケンスの先頭から、指定された数の連続する要素を返します。
public static IEnumerable<TSource> Take<TSource>
    (this IEnumerable<TSource> source, int count)
【VB】
シーケンスの先頭から、指定された数の連続する要素を返します。
<ExtensionAttribute>
Public Shared Function Take(Of TSource) 
   (source As IEnumerable(Of TSource), count As Integer) 
   As IEnumerable(Of TSource)


簡単に言うと…
シーケンス(配列やコレクション)の先頭から指定された数の要素を返します。

このメソッドは遅延実行されます。


テストデータです。
【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}
            }
Takeメソッドを使用して最初から3つ分の要素を取得します。
【C#】
//Takeメソッドで先頭より3つ分の要素を取得
var top3 = fruits.Take(3);
//出力
foreach(var itm in top3)
    Console.WriteLine("名称={0}, ランク={1}, 値段={2}", itm.Name, itm.Rank, itm.Price.ToString("#,##0"));  
//名称=りんご, ランク=A, 値段=1,000
//名称=みかん, ランク=A, 値段=600
//名称=ぶどう, ランク=B, 値段=1,200
【VB】
'Takeメソッドで先頭より3つ分の要素を取得
Dim top3 = fruits.Take(3)
'出力
For Each itm In top3
    Console.WriteLine("名称={0}, ランク={1}, 値段={2}", itm.Name, itm.Rank, itm.Price.ToString("#,##0"))
Next
'名称=りんご, ランク=A, 値段=1,000
'名称=みかん, ランク=A, 値段=600
'名称=ぶどう, ランク=B, 値段=1,200
Takeメソッドの引数にシーケンスの要素数以上の数を指定しても、例外は発生しません。すべての要素が返ります。
Takeメソッドの引数にシーケンスの要素数以下の数を指定した場合も、例外は発生しません。空のシーケンスが返ります。
【C#】
 //要素数以上の数を指定
var lst1 = fruits.Take(9);
//出力
foreach (var itm in lst1)
    Console.WriteLine("名称={0}, ランク={1}, 値段={2}", itm.Name, itm.Rank, itm.Price.ToString("#,##0"));  
//名称=りんご, ランク=A, 値段=1,000
//名称=みかん, ランク=A, 値段=600
//名称=ぶどう, ランク=B, 値段=1,200
//名称=りんご, ランク=B, 値段=800
//名称=みかん, ランク=A, 値段=500


//要素数以下の数を指定
var lst2 = fruits.Take(-9);
//出力
Console.WriteLine(lst2.Count());
//0
【VB】
'要素数以上の数を指定
Dim lst1 = fruits.Take(9)
'出力
For Each itm In lst1
    Console.WriteLine("名称={0}, ランク={1}, 値段={2}", itm.Name, itm.Rank, itm.Price.ToString("#,##0"))
Next
'名称=りんご, ランク=A, 値段=1,000
'名称=みかん, ランク=A, 値段=600
'名称=ぶどう, ランク=B, 値段=1,200
'名称=りんご, ランク=B, 値段=800
'名称=みかん, ランク=A, 値段=500


'要素数以下の数を指定
Dim lst2 = fruits.Take(-9)
'出力
Console.WriteLine(lst2.Count())
'0
※VBの場合、コンパイルオプションで「Option Infer」をONにし、型推論を有効にしてください。

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

0 件のコメント: