[LINQ] LINQ to Objects(Averageメソッド)

Averageメソッドは、その名の通り平均値を求めるメソッドです。

以下は、int型 の 配列変数である numbers のすべてのデータの平均値を求めます。

VBの例

Dim numbers() As Integer = {3, 5, 2, 1, 9, 8, 7}

Dim average = numbers.Average
Console.WriteLine("平均値は{0}です", average)

 

C#の例

int[] numbers = { 3, 5, 2, 1, 9, 8, 7 };

double average = numbers.Average();
Console.WriteLine("平均値は{0}です", average);

[LINQ] LINQ to Objects(Anyメソッド)

Anyメソッドを使用すると、指定した条件値が含まれるかどうかを調べることができます。

Anyメソッドに条件を指定すると、満たされているデータがある場合はtrueを返します。

例として、氏名、年齢、体重のデータを持つ3人分のデータを作成して、その中から体重が55kg未満、年齢が28歳以下のデータが含まれているかどうかを調べてみます。

VBの例

Public Class Person
    Public Property Name As String
    Public Property Age As Integer
    Public Property Weight
End Class


Private Sub CheckAgeWeight()
    Dim persons As Person() = {
      New Person() With {.Name = "HIRO", .Age = 42, .Weight = 60},
      New Person() With {.Name = "KAZU", .Age = 38, .Weight = 50},
      New Person() With {.Name = "RUI", .Age = 28, .Weight = 45}}


    Dim bCondition As Boolean = persons.Any(Function(p) p.Weight < 55 AndAlso p.Age <= 28)
    Console.WriteLine(String.Format("体重が55kg未満で年齢が28歳以下の人が{0}", IIf(bCondition, "いる", "いない")))
End Sub

C#の例

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int Weight { get; set; }
}

private void CheckAgeWeight
{
    Person[] persons = {
                   new Person {Name = "HIRO", Age = 42, Weight= 60},
                   new Person {Name = "KAZU", Age = 38, Weight= 50},
                   new Person {Name = "RUI", Age = 28, Weight = 45}
               };

    bool bCondition =
        persons.Any(p => p.Weight < 55 && p.Age <= 28);

    Console.WriteLine("体重が55kg未満で年齢が28歳以下の人が{0}", bCondition ? "いる": "いない");

}

上の例ではAnyメソッドの引数に p => p.Weight < 55 && p.Age <= 28 を指定しています。

データにはWeight(体重)が55kg未満の人が2人、Age(年齢)が28歳以下の人が1人いるので、この条件値は満たされれ、bConditionにはtrueが代入されます。

結果として、「体重が55kg未満で年齢が28歳以下の人がいる」が出力されます。

 

[LINQ] LINQ to Objects(Allメソッド)

LINQ to Objects という名前から、何かしらのオブジェクトを対象としたLINQであることが想像できます。

では、いったいどういうオブジェクトを対象としているのでしょうか?

これは IEnumerable<T>インターフェースが実装されているオブジェクトを対象としており、いわゆるコレクションに対して作用するLINQとなります。


Allメソッドを使ってみる

Allメソッドを使用すると、すべての条件が満たされているかを確認することができます。

たとえば 1, 3, -3, 0, 2 の数値が入った配列変数 numbersに負の値が含まれているかどうかをチェックする例です。

VBの例

Dim numbers() As Integer = {1, 3, -3, 0, 2}
Dim allPlus As Boolean = numbers.All(Function(n) n >= 0)

Console.WriteLine(IIf(allPlus, "すべて正の整数", "負の整数が含まれている"))

C#の例

int[] numbers = { 1, 3, -3, 0, 2 };

bool allPlus = numbers.All(n => n >= 0);

Console.WriteLine(allPlus ? "すべて正の整数" : "負の整数が含まれている");

数値型配列はコレクションなので、LINQを使用することが可能です。

ここではnumbers変数でAllメソッドを使用し、 n  => n >= 0 で、numbers変数の値が正かどうかを調べます。すべての値が正である場合は、allPlus変数にはtrueが代入されます。1つでも負の値が含まれている場合には、allPlusはfalseが代入されます。

このように、LINQを使用すると、すべての要素をチェックすることなく判定結果を得ることができます。


次回はAnyメソッドを紹介します。