猿教程 Logo

为什么要使用LINQ

要理解为什么我们应该使用LINQ,让我们来看一些例子。 假设你想从一个Student对象数组中找到少年学生的列表。

在C#2.0之前,我们必须使用'foreach'或'for'循环遍历集合以找到特定的对象。 例如,我们必须编写以下代码来从学生数组中查找其中年龄介于12到20岁之间(少年13到19岁)的所有学生对象:

相关实例:

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引入了delegate,它可以用来处理这种场景,如下图所示。

相关实例:

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

//Also, use another criteria using same delegate
Student[] students = StudentExtension.where(studentArray, delegate(Student std) {
        return std.StudentName == "Bill";
    });

C#团队认为他们仍然需要使代码更紧凑和可读。 所以他们在C#3.0中引入了扩展方法,lambda表达式,表达式树,匿名类型和查询表达式。 您可以使用C#3.0的这些功能,它们是LINQ的构建块,用于查询不同类型的集合,并在单个语句中获取结果元素。

下面的示例显示了如何使用LINQ查询与lambda表达式来查找学生集合中的特定学生。

相关实例:

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

        // Use LINQ to find teenager students
        Student[] teenAgerStudents = studentArray.Where(s => s.age > 12 && s.age < 20).ToArray();
       
        // Use LINQ to find first student whose name is Bill 
        Student bill = studentArray.Where(s => s.StudentName == "Bill").FirstOrDefault();
        
        // Use LINQ to find student whose StudentID is 5
        Student student5 = studentArray.Where(s => s.StudentID == 5).FirstOrDefault();
    }
}

正如你在上面的例子中看到的,我们在单个语句中使用LINQ运算符和lambda表达式指定不同的标准。 因此,LINQ使代码更紧凑和可读,并且它也可以用于查询不同的数据源。 例如,如果您在数据库中有学生表,而不是上面的学生对象数组,您仍然可以在使用Entity Framework时使用相同的查询来查找学生。


LINQ的优势

  1. 熟悉的语言:开发人员不必为每种类型的数据源或数据格式学习新的查询语言。

  2. 更少的编码:与更传统的方法相比,它减少了要编写的代码量。

  3. 可读代码:LINQ使代码更易读,因此其他开发人员可以轻松地理解和维护它。

  4. 标准化查询多个数据源的方式:同样的LINQ语法可以用于查询多个数据源。

  5. 查询的编译时安全性:它在编译时提供对对象的类型检查。

  6. 智能感知支持:LINQ为通用集合提供智能感知。

  7. 整形数据:您可以检索不同形状的数据。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Linq/why-linq.html