English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
为了理解为什么我们应该使用LINQ,让我们看一些示例。假设您要从一系列Student对象中查找青少年学生的列表。
在C#2.0之前,我们必须使用“ foreach”或“ for”循环遍历集合以查找特定对象。例如,我们必须编写以下代码,以从年龄在12a20 años (adolescentes)}}13a19encontrar todos los objetos de estudiante en una serie de estudiantes de
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++; } } } }
El uso de bucles for es complicado, inmanejable y de baja legibilidad. C#20.0 se introdujo el delegado, que se puede usar para manejar este tipo de situación, como se muestra a continuación.
Ejemplo: usar delegado desde C#2en la colección de 0.0 buscar elementos
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; }); } } }
Por lo tanto, usar C#2.0, puede aprovechar la ventaja de los delegados para encontrar estudiantes que cumplan con cualquier condición. No es necesario usar bucles for para encontrar estudiantes utilizando diferentes criterios. Por ejemplo, se puede usar la misma función de delegado para encontrar StudentId de5o encontrar al estudiante cuyo nombre sea Bill, como se muestra a continuación:
Student[] students = StudentExtension.where(studentArray, delegate(Student std) { return std.StudentID == 5; }); //Además, utilice el mismo delegado para otras condiciones Student[] students = StudentExtension.where(studentArray, delegate(Student std) { return std.StudentName == "Bill"; });
El equipo de C# cree que aún necesitan hacer el código más compacto y legible. Por lo tanto, en C#3.0 introdujo métodos de extensión, expresiones lambda, árboles de expresiones, tipos anónimos y expresiones de consulta. Puede usar C#3.0 para realizar estas operaciones (que son componentes de LINQ) para consultar diferentes tipos de conjuntos y obtener elementos de resultados en una sola declaración.
El siguiente ejemplo muestra cómo usar consultas LINQ con expresiones lambda para encontrar estudiantes específicos en una colección de estudiantes.
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 }; , }; // Usar LINQ para encontrar estudiantes adolescentes Student[] teenAgerStudents = studentArray.Where(s => s.age > 12 && s.age < 20).ToArray(); // Usar LINQ para encontrar al primer estudiante cuyo nombre es Bill Estudiante bill = studentArray.Where(s => s.StudentName == "Bill").FirstOrDefault(); // Usar LINQ para encontrar StudentID de5estudiante Estudiante student5 = studentArray.Where(s => s.StudentID == 5).FirstOrDefault(); } }
Como se muestra en el ejemplo anterior, especificamos diferentes condiciones utilizando operadores de LINQ y expresiones lambda en una sola declaración. Por lo tanto, LINQ hace que el código sea más compacto y legible, y también se puede usar para consultar diferentes fuentes de datos. Por ejemplo, si tiene una tabla de estudiantes en una base de datos en lugar del array de objetos de estudiantes superior, aún puede usar la misma consulta para encontrar estudiantes utilizando Entity Framework.
Lenguaje familiar (Familiar language): Los desarrolladores no necesitan aprender un nuevo lenguaje de consulta para cada tipo de fuente de datos o formato de datos.
Menos código (Less coding): En comparación con métodos más tradicionales, reduce la cantidad de código que se debe escribir.
Legibilidad del código (Readable code): LINQ hace que el código sea más legible, por lo que otros desarrolladores pueden entenderlo y mantenerlo fácilmente.
Método estandarizado de consulta de múltiples fuentes de datos (Standardized way of querying multiple data sources): La misma sintaxis de LINQ se puede usar para consultar múltiples fuentes de datos.
Seguridad en tiempo de compilación de consultas (Compile time safety of queries): Proporciona comprobación de tipos de objetos en tiempo de compilación.
Soporte de IntelliSense (IntelliSense Support): LINQ proporciona IntelliSense para conjuntos genéricos.
Forma de datos (Shaping data): Puede buscar datos en diferentes formas.