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

Преимущества LINQ

Чтобы понять, почему我们应该 использовать LINQ, давайте посмотрим на несколько примеров. Предположим, что вам нужно найти список студентов-подростков из серии объектов Student:

До C#2.0 нам необходимо использовать цикл "foreach" или "for", чтобы итерировать множество и находить определенный объект. Например, нам нужно написать следующий код, чтобы найти все объекты студентов из серии, чей возраст составляет от 12 до 20 лет (подростки от 13 до 19 лет):

В C# 1.0 для поиска элементов в集合е использовался цикл 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 очень неудобно, сложно поддерживать и плохо читается. В C# 2.0 был введен делегат, который можно использовать для обработки таких ситуаций, как показано ниже.

    Пример: использование делегата для поиска элементов в集合е из C# 2.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;
            });
        }
    }
}

Таким образом, используя 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# считает, что код все еще нужно сделать более компактным и читаемым. Поэтому они ввели расширяемые методы, lambda выражения, выражения дерева, анонимные типы и запросы в C# 3.0. Вы можете использовать эти функции C# 3.0 (являющиеся составными частями LINQ) для запросов в различных типах集合 и получения результатов в одном предложении.

В данном примере показано, как использовать LINQ запросы с lambda выражениями для поиска конкретных студентов в集合е 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 и лямбда-выражения для указания различных условий в одном предложении. Таким образом, LINQ делает код более компактным и читаемым, и его можно использовать для запросов к различным источникам данных. Например, если у вас есть таблица студентов в базе данных, а не массив объектов студентов, как в примере, вы все равно можете использовать этот же запрос для поиска студентов с помощью Entity Framework.

Преимущества LINQ

  • Знакомый язык: Разработчикам не нужно учиться новому языку запросов для каждого типа источника данных или формата данных.

  • Меньше кода: Комpared к более традиционным методам, он уменьшает количество кода, который нужно написать.

  • Читаемый код: LINQ делает код более читаемым, поэтому другие разработчики могут легко понимать и поддерживать его.

  • Стандартизированный способ запросов к нескольким источникам данных: Тот же синтаксис LINQ можно использовать для запросов к нескольким источникам данных.

  • Безопасность запросов в компиляционное время: Он предоставляет проверку типов объектов в компиляционное время.

  • Поддержка IntelliSense (поддержка интуитивного понимания): LINQ предоставляет IntelliSense для общих集合.

  • Формирование данных (данные формы): Вы можете检索数据 в различных формах.