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

Vantagens do LINQ

Para entender por que devemos usar LINQ, vamos ver alguns exemplos. Suponha que você precise encontrar a lista de estudantes adolescentes em uma série de objetos Student.

no C#2.0 antes, devemos usar um loop 'foreach' ou 'for' para percorrer a coleção para encontrar o objeto específico. Por exemplo, devemos escrever o seguinte código para encontrar a lista de estudantes adolescentes em12até2anos (adolescentes)13até19procurar todos os objetos de estudante em uma série de estudantes de

no C#1no conjunto 0.0, usar o loop for para encontrar elementos no conjunto
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++;
            }
        }
    }
}

O uso do loop for é complicado, inmanutenível e de baixa legibilidade. C#20.0 introduziu o delegate, que pode ser usado para lidar com isso, conforme mostrado a seguir.

    Exemplo: usar o delegate a partir do C#2no conjunto 0.0 encontrar elemento

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

Portanto, usando C#2.0, você pode aproveitar as vantagens da delegação para encontrar estudantes que atendam a qualquer condição. Você não precisa usar loops for para encontrar estudantes usando diferentes padrões. Por exemplo, você pode usar a mesma função de delegate para encontrar StudentId de5ou encontrar o aluno cujo nome é Bill, conforme mostrado a seguir:

Student[] students = StudentExtension.where(studentArray, delegate(Student std) {
        return std.StudentID == 5;
    });
//Além disso, use a mesma delegação para outras condições
Student[] students = StudentExtension.where(studentArray, delegate(Student std) {
        return std.StudentName == "Bill";
    });

A equipe do C# acredita que ainda é necessário tornar o código mais compacto e legível. Portanto, eles no C#3.0 introduziu métodos de extensão, expressões lambda, árvores de expressão, tipos anônimos e expressões de consulta. Você pode usar C#3.0, essas funcionalidades (que são os blocos de construção do LINQ) para consultar diferentes tipos de conjuntos e obter elementos de resultado em uma única instrução.

O exemplo a seguir demonstra como usar consultas LINQ com expressões lambda para encontrar estudantes específicos em uma coleção de estudantes.

Exemplo: 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  }; ,
           };
         // Usar LINQ para encontrar alunos adolescentes
         Student[] teenAgerStudents = studentArray.Where(s => s.age > 12 && s.age < 20).ToArray();       
        // Usar LINQ para encontrar o primeiro aluno cujo nome é Bill 
        Student bill = studentArray.Where(s => s.StudentName == "Bill").FirstOrDefault();        
        // Usar LINQ para encontrar StudentID de5do aluno        
        Student student5 = studentArray.Where(s => s.StudentID == 5).FirstOrDefault();
    }
}

Como mostrado no exemplo acima, usamos operadores LINQ e expressões lambda em uma única sentença para especificar diferentes condições. Portanto, o LINQ torna o código mais compacto e legível, e pode ser usado para consultar diferentes fontes de dados. Por exemplo, se você tiver uma tabela de alunos no banco de dados, em vez de um array de objetos de alunos acima, ainda pode usar a mesma consulta para encontrar alunos usando Entity Framework.

Vantagens do LINQ

  • Linguagem familiar (Familiar language): Desenvolvedores não precisam aprender um novo linguagem de consulta para cada tipo de fonte de dados ou formato de dados.

  • Menos código (Less coding): Em comparação com métodos mais tradicionais, ele reduz a quantidade de código a ser escrito.

  • Código legível (Readable code): O LINQ torna o código mais legível, permitindo que outros desenvolvedores o compreendam e mantenham facilmente.

  • Método padronizado para consultar várias fontes de dados (Standardized way of querying multiple data sources): A mesma sintaxe LINQ pode ser usada para consultar várias fontes de dados.

  • Segurança de consulta no tempo de compilação (Compile time safety of queries): Ele oferece verificação de tipos de objetos no tempo de compilação.

  • Suporte IntelliSense (IntelliSense Support): O LINQ oferece suporte IntelliSense para conjuntos genéricos.

  • Formação de dados (Shaping data): Você pode pesquisar dados em diferentes formatos.