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

LINQ 优点

为了理解为什么我们应该使用LINQ,让我们看一些示例。假设您要从一系列Student对象中查找青少年学生的列表。

在C#2.0之前,我们必须使用“ foreach”或“ for”循环遍历集合以查找特定对象。例如,我们必须编写以下代码,以从年龄在12bis20 Jahren (Jugendliche)}13bis19alle Schülerobjekte in einer Reihe von Schülern von 0 Jahren (Jugendliche) suchen:

In C#1in Version 0.0, die Verwendung von for-Schleifen zum Suchen nach Elementen in einer Sammlung
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++;
            }
        }
    }
}

Die Verwendung von for-Schleifen ist umständlich, unmaintainable und schlecht lesbar. C#20.0, um diese Situation zu behandeln, wie folgt.

    Beispiel: Verwenden Sie Delegaten aus C#2im Suchen nach Elementen in einer Sammlung von Version 0.0

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;
            });
        }
    }
}

Daher verwenden Sie C#2.0, können Sie die Vorteile der Delegierten nutzen, um Schüler zu finden, die jede Art von Bedingung erfüllen. Sie müssen nicht mit einem for-Schleifen durch verschiedene Kriterien zu findende Schüler suchen. Zum Beispiel können Sie denselben Delegierten verwenden, um Schüler mit dem StudentId5oder Schüler mit dem Namen Bill, wie folgt:

Student[] students = StudentExtension.where(studentArray, delegate(Student std) {
        return std.StudentID == 5;
    });
//Darüber hinaus verwenden Sie denselben Delegierten für andere Bedingungen
Student[] students = StudentExtension.where(studentArray, delegate(Student std) {
        return std.StudentName == "Bill";
    });

Das C#-Team glaubt, dass sie den Code immer noch weiter komprimieren und lesbarer machen müssen. Daher haben sie in C#3.0 erweiterte Methoden, Lambda-Ausdrücke, Ausdrucksbäume, anonyme Typen und Query-Expressions eingeführt. Sie können C#3.0 diese Funktionen (die Bausteine von LINQ) verwenden, um verschiedene Arten von Sammlungen abzufragen und die Ergebnisse in einer einzigen Anweisung zu erhalten.

Der folgende Beispiel zeigt, wie Sie mit LINQ-Abfragen, die Lambda-Ausdrücke verwenden, spezifische Schüler aus einer Schüler-Kollektion finden.

Beispiel: 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  }; ,
           };
         // Verwenden Sie LINQ, um Jugendliche Schüler zu finden
         Student[] teenAgerStudents = studentArray.Where(s => s.age > 12 && s.age < 20).ToArray();       
        // Verwenden Sie LINQ, um den ersten Schüler mit dem Namen Bill zu finden 
        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): 您可以以不同的形状检索数据。