Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

266
Visualizações
LINQ Any() y Single() frente a SingleOrDefault() con verificación nula

¿En qué casos se prefiere cada solución sobre la otra?

Ejemplo 1:

 if (personList.Any(x => x.Name == "Fox Mulder")) { this.Person = personList.Single(x => x.Name == "Fox Mulder"); }

Ejemplo 2:

 var mulder = personList.SingleOrDefault(x => x.Name == "Fox Mulder"); if (mulder != null) { this.Person = mulder; }
over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Tanto Single como SingleOrDefault enumerarán la colección más allá del primer resultado coincidente para verificar que haya exactamente un elemento que coincida con los criterios, deteniéndose en la siguiente coincidencia o al final de la colección. El primer ejemplo será un poco más lento, ya que la llamada Any enumerará lo suficiente de la colección (posiblemente toda) para determinar si algún elemento cumple con los criterios, deteniéndose en la primera coincidencia o al final de la colección.

Hay otra diferencia crítica: el primer ejemplo podría generar una excepción. Single devolverá el elemento coincidente si hay exactamente uno y lanzará una excepción de lo contrario. Verificar con Any no verifica esto; solo verifica que haya al menos uno .

Basado en una de estas dos razones (principalmente/especialmente la segunda razón), el enfoque SingleOrDefault es preferible aquí.


Entonces, hay tres casos aquí.

Caso 1: ningún artículo coincide con la condición

Opción 1: .Any enumera todo el conjunto y devuelve falso; .Single nunca se ejecuta.

Opción 2: .SingleOrDefault enumera todo el conjunto y devuelve nulo.

Opciones esencialmente equivalentes.

Caso 2: Exactamente un artículo coincide con la condición

Opción 1: Any enumera lo suficiente del conjunto para encontrar la única coincidencia (podría ser el primer elemento, podría ser el conjunto completo). A continuación, Single enumera todo el conjunto para encontrar ese elemento y confirmar que ningún otro cumple la condición.

Opción 2: SingleOrDefault enumera todo el conjunto, devuelve la única coincidencia.

En este caso, la opción 2 es mejor (exactamente una iteración, en comparación con (1, 2] iteraciones)

Caso 3: más de un elemento coincide con la condición

Opción 1: Any enumera lo suficiente como para encontrar la primera coincidencia. Single enumera lo suficiente para encontrar la segunda coincidencia, lanza una excepción.

Opción 2: SingleOrDefault enumera lo suficiente para encontrar la segunda coincidencia, lanza una excepción.

Ambos arrojan excepciones, pero la opción 2 llega más rápido.

over 4 years ago · Santiago Trujillo Relatório

0

Extrapolando de is v. as pautas:

Vea a continuación, desde Casting vs usando la palabra clave 'as' en CLR :

 // Bad code - checks type twice for no reason if (randomObject is TargetType) { TargetType foo = (TargetType) randomObject; // Do something with foo }

Al usar Any y Single , también está revisando la lista dos veces. Y parecería aplicarse la misma lógica: Not only is this checking twice, but it may be checking different things, es decir, en una aplicación de subprocesos múltiples, la lista podría ser diferente entre la verificación y la asignación. En casos extremos, es posible que el elemento encontrado con Any ya no exista cuando se realiza la llamada a Single .

Usando esta lógica, preferiría el ejemplo dos en todos los casos hasta que se demuestre lo contrario.

over 4 years ago · Santiago Trujillo Relatório

0

Opción 3:

 this.Person = personList.FirstOrDefault(x => x.Name == "Fox Mulder");

si usa Entity Framework y el nombre es la clave principal, entonces:

 this.person = db.personList.Find("Fox Mulder");

Ambos funcionan si this.Person es nulo al ingresar, o si no se encuentra la persona, espera que this.Person se sobrescriba con nulo. FirstOrDefault es el más rápido, ya que se detendrá en el primer registro que coincida en lugar de recorrer toda la colección, pero no generará una excepción si se encuentran varios. La solución del marco de la entidad es aún mejor en ese caso porque Find usará el caché EF, posiblemente sin tener que acceder a la fuente de datos en absoluto.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda