English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

LINQ 的利点

LINQを使用する理由を理解するために、いくつかの例を見てみましょう。仮にStudentオブジェクトのリストからティーンエージャーの学生のリストを検索する必要があるとします。

C#2.0以前、には「foreach」または「for」ループを使用してコレクションを遍历して特定のオブジェクトを検索する必要があります。例えば、以下のコードを書かなくてはなりません、年齢が12~20歳(青少年)13~19歳)の学生オブジェクトをすべて検索する:

C#10で、コレクションから要素をforループを使用して検索
class Student
{
    public int StudentID { get; set; }
    public String StudentName { get; set; }
    public int Age { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        Student[] studentArray = { 
            new Student() { StudentID = 1, StudentName = "John", Age = 18 },
            new Student() { StudentID = 2, StudentName = "Steve",     Age = 21 },
            new Student() { StudentID = 3, StudentName = "Bill",     Age = 25 },
            new Student() { StudentID = 4, StudentName = "Ram", , Age = 20 },
            new Student() { StudentID = 5, StudentName = "Ron", , Age = 31 },
            new Student() { StudentID = 6, StudentName = "Chris",     Age = 17 },
            new Student() { StudentID = 7, StudentName = "Rob", Age = 19  },
        };
        Student[] students = new Student[10];
        int i = 0;
        foreach (Student std in studentArray)
        {
            if (std.Age > 12 && std.Age < 20)
            {
                students[i] = std;
                i++;
            }
        }
    }
}

forループの使用は厄介で、メンテナンスが難しく、可読性が低い。20からデリゲートを使用してこのような状況を処理する方法

    例:C#20中的集合に要素を検索

delegate bool FindStudent(Student std);
class StudentExtension
{ 
    public static Student[] where(Student[] stdArray, FindStudent del)
    {
        int i = 0;
        Student[] result = new Student[10];
        foreach (Student std in stdArray)
            if (del(std))
            {
                result[i] = std;
                i++;
            }
        return result;
    }
}
    
class Program
{
    static void Main(string[] args)
    {
        Student[] studentArray = { 
            new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
            new Student() { StudentID = 2, StudentName = "Steve",     Age = 21 } ,
            new Student() { StudentID = 3, StudentName = "Bill",     Age = 25 } ,
            new Student() { StudentID = 4, StudentName = "Ram", , Age = 20 } ,
            new Student() { StudentID = 5, StudentName = "Ron", , Age = 31 } ,
            new Student() { StudentID = 6, StudentName = "Chris",     Age = 17 } ,
            new Student() { StudentID = 7, StudentName = "Rob", Age = 19  } ,
        };
        Student[] students = StudentExtension.where(studentArray, delegate(Student std){
                return std.Age >} 12 && std.Age < 20;
            });
        }
    }
}

したがって、C#2.0、デリゲートの利点を利用して、異なる基準に基づく学生を検索できます。異なる基準に基づく学生を検索するためにforループを使用する必要はありません。例えば、同じデリゲート関数を使用してStudentIdが5または名前がBillの学生を以下のように検索します:

Student[] students = StudentExtension.where(studentArray, delegate(Student std) {
        return std.StudentID == 5;
    });
//さらに、同じデリゲートを使用して他の条件も指定してください
Student[] students = StudentExtension.where(studentArray, delegate(Student std) {
        return std.StudentName == "Bill";
    });

したがって、C#3.0で拡張メソッド、lambda式、表現木、匿名型、クエリ式が導入されました。C#を使用して、C#チームはコードをよりコンパクトで読みやすくする必要があると考えています。3.0のこれらの機能(それらはLINQの構成要素です)を使用して、異なる種類のコレクションをクエリし、単一のステートメントで結果要素を取得できます。

以下の例では、lambda式を含むLINQクエリを使用して特定の学生をstudentコレクションから検索する方法を示します。

例:LINQ
class Program
{    static void Main(string[] args)
    {        
          Student[] studentArray = { 
                    new Student() { StudentID = 1, StudentName = "John", age = 18 } ,
                    new Student() { StudentID = 2, StudentName = "Steve",  age = 21 } ,
                    new Student() { StudentID = 3, StudentName = "Bill",  age = 25 } ,
                    new Student() { StudentID = 4, StudentName = "Ram" , age = 20 } ,
                    new Student() { StudentID = 5, StudentName = "Ron" , age = 31 } ,
                    new Student() { StudentID = 6, StudentName = "Chris",  age = 17 } ,
                    new Student() { StudentID = 7, StudentName = "Rob",age = 19  } ,
           };
         // LINQを使用して青少年学生を検索します
         Student[] teenAgerStudents = studentArray.Where(s => s.age > 12 && s.age < 20).ToArray();       
        // LINQを使用して名前がBillの最初の学生を検索します 
        Student bill = studentArray.Where(s => s.StudentName == "Bill").FirstOrDefault();        
        // LINQを使用してStudentIDが5の学生        
        Student student5 = studentArray.Where(s => s.StudentID == 5).FirstOrDefault();
    }
}

上記の例のように、我々は単一の文でLINQ演算子とlambda表現式を使用して、異なる条件を指定します。したがって、LINQはコードをコンパクトにし、可読性を高め、異なるデータソースを検索するために使用できます。例えば、データベースに学生テーブルがある場合、上記の学生オブジェクト配列ではなく、エンティティフレームワークを使用して学生を検索する同じクエリを使用できます。

LINQの利点

  • 馴染みやすい言語(Familiar language): 開発者は各種データソースやデータ形式ごとに新しいクエリ言語を学ぶ必要はありません。

  • コード量の少なさ(Less coding): より伝統的な方法と比較して、書く必要のあるコード量が減少します。

  • 可読なコード(Readable code): LINQはコードの可読性を向上させ、他の開発者が簡単に理解し、メンテナンスできるようにします。

  • 複数のデータソースの検索の標準化方法(Standardized way of querying multiple data sources): 同じLINQ構文が複数のデータソースの検索に使用できます。

  • クエリのコンパイル時安全性(Compile time safety of queries): それにより、コンパイル時にオブジェクトの型検査が提供されます。

  • IntelliSense Support(インテリジェンスサポート): LINQは一般的なコレクションにIntelliSenseを提供します。

  • データの形状(Shaping data): 異なる形状でデータを検索できます。