Linqの基本的な使用法
Linq、言語統合クエリは、C#の拡張機能のセットです。Linqを使用すると、コレクションなどのメモリデータに加えて、データベース(datebase)およびXML(標準のユニバーサルマークアップ言語)データをクエリできます。これらのデータは、それぞれLinq to object、Linq to datebase、Linq toXMLと呼ばれます。これが反対するLinqです。
Linqの記述方法は、データベースSQLステートメントのクエリ構文に似ています。
from 变量名 in 集合 where 条件 select 结果变量
その中で、変数名は一時変数であり、コレクションは配列または他のコレクションオブジェクトであり、条件は通常、変数の論理式であり、結果変数は通常、変数名の式です(変数の場合もあります)。自体)。例えば:
from n in arr where n > 5 select n;
配列arr
(n
)から5より大きい要素を見つけ、最後にこれらを選択することを意味しますn
。
これらの数値の2乗を選択すると、次のようになります。
from n in arr where n > 5 select n * n;
条件を満たす番号については、最初に降順で並べ替えてから、次のような結果を出力できます。
from n in arr where n > 5 orderby n descending select n * n;
例1
int
配列よりも大きい数を照会し、サイズ順に並べます。
static void Main(string[] args) {
Random rnd = new Random();
// 示例1,查询int数组中大于10的数字,并按照大小顺序排列:
int[] arr = new int[20];
for (int i = 0; i < arr.Length; i++) arr[i] = rnd.Next(20);
var m = from n in arr where n > 10 orderby n descending select n;
foreach (var n in m)
Console.Write(n + " ");
Console.WriteLine();
}
演算結果:
上記の例からわかるように、Linq
クエリ構文はSQLクエリ構文と非常に似ていますfrom
が、変数のタイプを推測できるように、前に配置する必要があります。統合開発環境では、インテリセンスを実行します。
Linq
クエリの結果は、IEnumerable
インターフェイスを実装する列挙子オブジェクトを返します。このオブジェクトの型は、通常、非常に複雑です。var
型で表され、コンパイラは自動的にその型を推測します。このvar
オブジェクトはforeach
トラバースに使用できます。一部のLinq
クエリの結果は、IQuerable
インターフェイスを実装する「クエリ可能なオブジェクト」です。IQuerable
インターフェイスはインターフェイスIEnumerable
のサブインターフェイスであるため、より複雑な操作を実行できます。
価値があるノートは列挙子:あるvar
オブジェクトと本当にときにのみ使用し、クエリを開始しませんforeach
トラバースまでの時間は、クエリの処理が実際に実行します。
例2
グループグループ化関数を使用した、もう少し複雑なLinqクエリ:
static void Main(string[] args) {
// 示例2,一个稍微复杂的Linq查询,使用group分组功能:
string[] languages = {
"Java", "C#", "C++", "Delphi", "VB.net", "VC.net", "Perl", "Python" };
var query = from item in languages
group item by item.Length into lengthGroups
orderby lengthGroups.Key
select lengthGroups;
foreach (var group in query) {
Console.WriteLine("strings of length{0}", group.Key);
foreach (var str in group) {
Console.WriteLine(str);
}
}
}
演算結果:
この例でlength
は、データは文字長()(group
)に従ってグループ化され、lengthGroups
変数に入れられ、グループ化キーワード(.Key
)によってソートされます。結果の列挙子は、二重foreach
ループでトラバースされます。
Linqのクエリメソッド
40について定義のLINQクエリ演算子のようなselect
、from
、in
、where
とorderby
のような。
1.Linqを作成する2つの方法
1つの形式はクエリ式の構文であり、もう1つはSQL構文に近く、読みやすいクエリメソッドです。
もう1つの形式は、クエリメソッド構文(メソッド構文)です。これはSystem.Linq.Enumerable
、主にクラスで定義された拡張メソッドとクエリのLambda式メソッドを使用します。例えば:
List<int> arr = new List<int>() {
1, 2, 3, 4, 5, 6, 7 };
var result = arr.Where(a => a > 3).Sum();
Console.WriteLine(result);
このコードでは、2つの拡張メソッドが使用されています。
1つはWhere
拡張メソッドで、Func<int, bool>
ジェネリックデリゲートのタイプを渡す必要があります。これは、要素(int
タイプの変数)(a > 3
)を判断することを意味し、戻り値はbool
タイプです。a => a > 3
これは、このラムダ式をWhere
メソッドに直接転送するものです。
もう1つは、Sum
拡張メソッドWhere
によって返されるコレクションの合計を計算する拡張メソッドです。equal句
を使用するwhere
と、実際Enumerable
にはクラスで定義されている拡張メソッドが呼び出されます。
2.拡張方法
ここでのいわゆる「拡張メソッド」はstatic
、クラスで定義されたグローバル関数です。this
パラメータを取ることができます。つまり、メソッドが特定のオブジェクトに適用され、コンパイラが自動的に拡張メソッドに変換します。
例
文字列への拡張メソッド:
using System;
public static class ExtensionMethodString
{
public static int WordCount(this string s) {
string[] words = s.Split(" ,;.!".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
return words.Length;
}
}
class Demo
{
static void Main(string[] args){
string s = "Hello world,C#!";
int cnt = s.WordCount();
Console.WriteLine(cnt);
}
}
output:
3
ここでは、string
オブジェクトが拡張され、WordCount
メソッドが追加されますがstring
、クラス内には追加されませんが、メソッドを定義する別のstatic
クラスがExtensionMethodString
定義され、最初のパラメーター(型)の前に特別なthisが付きます。これは、それが特殊なタイプの拡張メソッド。コンパイラはそれを自動的に呼び出しに変換します。拡張メソッドは非常に便利なメカニズムであり、実際には一種の糖衣構文である元のクラスの定義を変更せずに、元のメソッドにメソッドを「追加」します。拡張メソッドはC#3.0から導入され、その機能の1つはLinqにサービスを提供することです。Linqテクノロジでは、.NETの設計者がクラスライブラリに一連の拡張メソッドを定義して、ユーザーがコレクションオブジェクトを操作しやすくしました。これらの拡張メソッドは、Linqのクエリ演算子を構成します。static
WordCount
string
string
s.WordCount()
ExtensionMethodString.WordCount
3.Linqのクエリ演算子
Linqのさまざまなクエリ演算子は、実際にはSystem.Linq.Enumerable
クラスで定義された一連の拡張メソッドです。これらの拡張メソッドは、IEnumerable
ピアオブジェクトの拡張です。したがって、var result = arr.Where(a => a > 3).Sum()
この呼び出しメソッドを使用して呼び出すことができます。
次の表に示すように、Linqには40を超える標準クエリ演算子があります。これらのメソッドは、ごく一部のような同等のクエリ式のキーワード、持つことができる持っているwhere
キーワードは同等ですWhere
方法を、同様のがありselect
、group
、orderby
、join
というように。
実行時間の観点から、各標準クエリ演算子は2つのカテゴリに分類できます。1つは即時実行で、もう1つは遅延実行です。単一の値を返すメソッド(Average
およびなどSum
)はすぐに実行されます。シーケンスを返すメソッドは、列挙可能な(IEnumerable
)オブジェクトを返すため、クエリの実行を遅らせます。このオブジェクトは、foreach
トラバースまたはSum
操作の再実行に使用された場合にのみ実行されます。クエリ演算子には2つのタイプがあるとも言えます。1つは「中間点」(などWhere
)で、他のクエリ演算子を引き続き適用できます。もう1つは「終了」(などSum
)とその結果です。他のクエリには適用できません。演算子。
以下は、一般的に使用される演算子と簡単な紹介です。
場所:条件を満たすものを除外します。
選択:要素を取り出します(新しいオブジェクトにマップできます)。
最初:シーケンスの最初の要素を取り出します。
テイクアウト:いくつかの要素を取り出します。
シングル:シーケンスの唯一の要素を取り出します。要素の数が1でない場合、エラーが報告されます。
FirstOrDefault:シーケンスの最初の要素を取得します。要素がない場合は、デフォルト値を返します。
Distinct:シーケンス内の繰り返しのない要素を取り出します。
Orderby:並べ替え。
逆:逆順。
Concat:2つのシーケンスを接続します。すべてのSQLのUnionに相当します。
含む:シーケンスに指定された要素が含まれるかどうか。
例外:2つのシーケンスの差を取得します。
交差:2つのシーケンスの交差を取得します。
平均:平均値を計算します。
最小:最小の要素。
最大:最大の要素。
合計:要素の合計。
カウント:要素の数。