C# Language
Linqからオブジェクトへ
サーチ…
前書き
LINQ to Objectsは、任意のIEnumerableコレクションでLINQクエリを使用することを指します。
LINQ to Objectによるクエリの実行方法
LINQクエリはすぐに実行されません。クエリを作成するときは、単に将来の実行のためにクエリを格納するだけです。あなたが実際にクエリを反復することを要求したときにのみ、実行されたクエリ(例えばforループ、ToList、Count、Max、Average、Firstなどを呼び出すとき)
これは、 遅延実行と見なされます。これにより、クエリを複数のステップで構築し、条件付きステートメントに基づいてクエリを変更し、結果を必要とした後に実行することができます。
与えられたコード:
var query = from n in numbers
where n % 2 != 0
select n;
上記の例では、クエリをquery
変数に格納するだけです。クエリ自体は実行されません。
foreach
文はクエリを強制的に実行します。
foreach(var n in query) {
Console.WriteLine($"Number selected {n}");
}
一部のLINQメソッドは、クエリの実行、 Count
、 First
、 Max
、 Average
もトリガします。彼らは単一の値を返します。 ToList
とToArray
はそれぞれ結果を集めてリストまたは配列に変換します。
同じクエリで複数のLINQ関数を呼び出すと、複数回にわたってクエリを繰り返し処理できることに注意してください。これは、各呼び出しで異なる結果を与える可能性があります。 1つのデータセットでのみ作業する場合は、必ずリストまたはアレイに保存してください。
C#でのオブジェクトへのLINQの使用
Linqでの簡単なSELECTクエリ
static void Main(string[] args)
{
string[] cars = { "VW Golf",
"Opel Astra",
"Audi A4",
"Ford Focus",
"Seat Leon",
"VW Passat",
"VW Polo",
"Mercedes C-Class" };
var list = from car in cars
select car;
StringBuilder sb = new StringBuilder();
foreach (string entry in list)
{
sb.Append(entry + "\n");
}
Console.WriteLine(sb.ToString());
Console.ReadLine();
}
上記の例では、文字列(車)の配列は、LINQを使用して照会するオブジェクトのコレクションとして使用されています。 LINQクエリでは、データソース(cars)と範囲変数(car)を導入するために、from句が最初に来ます。クエリが実行されると、range変数は自動車内の各連続する要素への参照として機能します。コンパイラは車のタイプを推測できるので、明示的に指定する必要はありません
上記のコードをコンパイルして実行すると、次の結果が生成されます。
WHERE句を含むSELECT
var list = from car in cars
where car.Contains("VW")
select car;
WHERE句は、WHERE句を満たす配列のサブセットを見つけて返すために、文字列配列(車)を照会するために使用されます。
上記のコードをコンパイルして実行すると、次の結果が生成されます。
順序付きリストの生成
var list = from car in cars
orderby car ascending
select car;
返されたデータをソートすると便利なことがあります。 orderby句を使用すると、ソート対象の型のデフォルトの比較元に従って要素がソートされます。
上記のコードをコンパイルして実行すると、次の結果が生成されます。
カスタムタイプの操作
この例では、型付きリストが作成され、移入された後、照会されます
public class Car
{
public String Name { get; private set; }
public int UnitsSold { get; private set; }
public Car(string name, int unitsSold)
{
Name = name;
UnitsSold = unitsSold;
}
}
class Program
{
static void Main(string[] args)
{
var car1 = new Car("VW Golf", 270952);
var car2 = new Car("Opel Astra", 56079);
var car3 = new Car("Audi A4", 52493);
var car4 = new Car("Ford Focus", 51677);
var car5 = new Car("Seat Leon", 42125);
var car6 = new Car("VW Passat", 97586);
var car7 = new Car("VW Polo", 69867);
var car8 = new Car("Mercedes C-Class", 67549);
var cars = new List<Car> {
car1, car2, car3, car4, car5, car6, car7, car8 };
var list = from car in cars
select car.Name;
foreach (var entry in list)
{
Console.WriteLine(entry);
}
Console.ReadLine();
}
}
上記のコードをコンパイルして実行すると、次の結果が生成されます。
これまでの例では、配列を繰り返して基本的に同じことを行うことができるので、驚くような例はありません。ただし、以下のいくつかの例では、LINQ to Objectを使用してより複雑なクエリを作成し、コードを大幅に減らしてより多くの結果を得る方法を確認できます。
以下の例では、60000台以上売られている車を選んで販売台数を並べ替えることができます:
var list = from car in cars
where car.UnitsSold > 60000
orderby car.UnitsSold descending
select car;
StringBuilder sb = new StringBuilder();
foreach (var entry in list)
{
sb.AppendLine($"{entry.Name} - {entry.UnitsSold}");
}
Console.WriteLine(sb.ToString());
上記のコードをコンパイルして実行すると、次の結果が生成されます。
下の例では、奇数のユニットを販売している車を選択し、名前のアルファベット順に並べ替えることができます。
var list = from car in cars
where car.UnitsSold % 2 != 0
orderby car.Name ascending
select car;
上記のコードをコンパイルして実行すると、次の結果が生成されます。