C#スタディノートLinq

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;

配列arrnから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クエリ演算子のようなselectfrominwhereorderbyのような。

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のクエリ演算子を構成します。staticWordCountstringstrings.WordCount()ExtensionMethodString.WordCount

3.Linqのクエリ演算子

Linqのさまざまなクエリ演算子は、実際にはSystem.Linq.Enumerableクラスで定義された一連の拡張メソッドです。これらの拡張メソッドは、IEnumerableピアオブジェクトの拡張です。したがって、var result = arr.Where(a => a > 3).Sum()この呼び出しメソッドを使用して呼び出すことができます
次の表に示すように、Linqには40を超える標準クエリ演算子があります。これらのメソッドは、ごく一部のような同等のクエリ式のキーワード、持つことができる持っているwhereキーワードは同等ですWhere方法を、同様のがありselectgrouporderbyjoinというように。
ここに画像の説明を挿入
実行時間の観点から、各標準クエリ演算子は2つのカテゴリに分類できます。1つは即時実行で、もう1つは遅延実行です。単一の値を返すメソッド(AverageおよびなどSum)はすぐに実行されます。シーケンスを返すメソッドは、列挙可能な(IEnumerable)オブジェクトを返すため、クエリの実行を遅らせます。このオブジェクトは、foreachトラバースまたはSum操作の実行に使用された場合にのみ実行されます。クエリ演算子には2つのタイプがあるとも言えます。1つは「中間点」(などWhere)で、他のクエリ演算子を引き続き適用できます。もう1つは「終了」(などSum)とその結果です。他のクエリには適用できません。演算子。
以下は、一般的に使用される演算子と簡単な紹介です。
場所:条件を満たすものを除外します。
選択:要素を取り出します(新しいオブジェクトにマップできます)。
最初:シーケンスの最初の要素を取り出します。
テイクアウト:いくつかの要素を取り出します。
シングル:シーケンスの唯一の要素を取り出します。要素の数が1でない場合、エラーが報告されます。
FirstOrDefault:シーケンスの最初の要素を取得します。要素がない場合は、デフォルト値を返します。
Distinct:シーケンス内の繰り返しのない要素を取り出します。
Orderby:並べ替え。
:逆順。
Concat:2つのシーケンスを接続します。すべてのSQLのUnionに相当します。
含む:シーケンスに指定された要素が含まれるかどうか。
例外:2つのシーケンスの差を取得します。
交差:2つのシーケンスの交差を取得します。
平均:平均値を計算します。
最小:最小の要素。
最大:最大の要素。
合計:要素の合計。
カウント:要素の数。

おすすめ

転載: blog.csdn.net/qq_45349225/article/details/114335541
おすすめ