C# Language Tout d'abord, FirstOrDefault, Last, LastOrDefault, Single et SingleOrDefault


Exemple

Les six méthodes renvoient une seule valeur du type de séquence et peuvent être appelées avec ou sans prédicat.

Selon le nombre d'éléments correspondant au predicate ou, si aucun predicate n'est fourni, le nombre d'éléments de la séquence source, ils se comportent comme suit:

Premier()

  • Renvoie le premier élément d'une séquence ou le premier élément correspondant au predicate fourni.
  • Si la séquence ne contient aucun élément, une InvalidOperationException est lancée avec le message: "La séquence ne contient aucun élément".
  • Si la séquence ne contient aucun élément correspondant au predicate fourni, une InvalidOperationException est InvalidOperationException avec le message "La séquence ne contient aucun élément correspondant".

Exemple

// Returns "a":
new[] { "a" }.First();

// Returns "a":
new[] { "a", "b" }.First();

// Returns "b":
new[] { "a", "b" }.First(x => x.Equals("b"));

// Returns "ba":
new[] { "ba", "be" }.First(x => x.Contains("b"));

// Throws InvalidOperationException:
new[] { "ca", "ce" }.First(x => x.Contains("b"));

// Throws InvalidOperationException:
new string[0].First();

Démo en direct sur .NET Fiddle

FirstOrDefault ()

  • Renvoie le premier élément d'une séquence ou le premier élément correspondant au predicate fourni.
  • Si la séquence ne contient aucun élément ou aucun élément correspondant au predicate fourni, retourne la valeur par défaut du type de séquence en utilisant la default(T) par default(T) .

Exemple

// Returns "a":
new[] { "a" }.FirstOrDefault();

// Returns "a":
new[] { "a", "b" }.FirstOrDefault();

// Returns "b":
new[] { "a", "b" }.FirstOrDefault(x => x.Equals("b"));

// Returns "ba":
new[] { "ba", "be" }.FirstOrDefault(x => x.Contains("b"));

// Returns null:
new[] { "ca", "ce" }.FirstOrDefault(x => x.Contains("b"));

// Returns null:
new string[0].FirstOrDefault();

Démo en direct sur .NET Fiddle

Dernier()

  • Renvoie le dernier élément d'une séquence ou le dernier élément correspondant au predicate fourni.
  • Si la séquence ne contient aucun élément, une InvalidOperationException est lancée avec le message "La séquence ne contient aucun élément".
  • Si la séquence ne contient aucun élément correspondant au predicate fourni, une InvalidOperationException est InvalidOperationException avec le message "La séquence ne contient aucun élément correspondant".

Exemple

// Returns "a":
new[] { "a" }.Last();

// Returns "b":
new[] { "a", "b" }.Last();

// Returns "a":
new[] { "a", "b" }.Last(x => x.Equals("a"));

// Returns "be":
new[] { "ba", "be" }.Last(x => x.Contains("b"));

// Throws InvalidOperationException:
new[] { "ca", "ce" }.Last(x => x.Contains("b"));

// Throws InvalidOperationException:
new string[0].Last(); 

LastOrDefault ()

  • Renvoie le dernier élément d'une séquence ou le dernier élément correspondant au predicate fourni.
  • Si la séquence ne contient aucun élément ou aucun élément correspondant au predicate fourni, retourne la valeur par défaut du type de séquence en utilisant la default(T) par default(T) .

Exemple

// Returns "a":
new[] { "a" }.LastOrDefault();

// Returns "b":
new[] { "a", "b" }.LastOrDefault();

// Returns "a":
new[] { "a", "b" }.LastOrDefault(x => x.Equals("a"));

 // Returns "be":
new[] { "ba", "be" }.LastOrDefault(x => x.Contains("b"));

// Returns null:
new[] { "ca", "ce" }.LastOrDefault(x => x.Contains("b")); 

// Returns null:
new string[0].LastOrDefault();

Unique()

  • Si la séquence contient exactement un élément ou exactement un élément correspondant au predicate fourni, cet élément est renvoyé.
  • Si la séquence ne contient aucun élément ou aucun élément correspondant au predicate fourni, une InvalidOperationException est lancée avec le message "La séquence ne contient aucun élément".
  • Si la séquence contient plusieurs éléments ou plusieurs éléments correspondant au predicate fourni, une InvalidOperationException est lancée avec le message "La séquence contient plusieurs éléments".
  • Remarque: pour évaluer si la séquence contient exactement un élément, deux éléments au plus doivent être énumérés.

Exemple

// Returns "a":
new[] { "a" }.Single();

// Throws InvalidOperationException because sequence contains more than one element:
new[] { "a", "b" }.Single();

// Returns "b":
new[] { "a", "b" }.Single(x => x.Equals("b"));

// Throws InvalidOperationException:
new[] { "a", "b" }.Single(x => x.Equals("c"));

// Throws InvalidOperationException:
new string[0].Single(); 

// Throws InvalidOperationException because sequence contains more than one element:
new[] { "a", "a" }.Single();

SingleOrDefault ()

  • Si la séquence contient exactement un élément ou exactement un élément correspondant au predicate fourni, cet élément est renvoyé.
  • Si la séquence ne contient aucun élément ou aucun élément correspondant au predicate fourni, la default(T) est renvoyée.
  • Si la séquence contient plusieurs éléments ou plusieurs éléments correspondant au predicate fourni, une InvalidOperationException est lancée avec le message "La séquence contient plusieurs éléments".
  • Si la séquence ne contient aucun élément correspondant au predicate fourni, retourne la valeur par défaut du type de séquence en utilisant la default(T) par default(T) .
  • Remarque: pour évaluer si la séquence contient exactement un élément, deux éléments au plus doivent être énumérés.

Exemple

// Returns "a":
new[] { "a" }.SingleOrDefault();

// returns "a"
new[] { "a", "b" }.SingleOrDefault(x => x == "a"); 

// Returns null:
new[] { "a", "b" }.SingleOrDefault(x => x == "c");

// Throws InvalidOperationException:
new[] { "a", "a" }.SingleOrDefault(x => x == "a");

// Throws InvalidOperationException:
new[] { "a", "b" }.SingleOrDefault();

// Returns null:
new string[0].SingleOrDefault();

Recommandations

  • Bien que vous puissiez utiliser FirstOrDefault , LastOrDefault ou SingleOrDefault pour vérifier si une séquence contient des éléments, Any ou Count sont plus fiables. En effet, une valeur de retour default(T) de l'une de ces trois méthodes ne prouve pas que la séquence est vide, car la valeur du premier / dernier / seul élément de la séquence pourrait également être default(T)

  • Décidez des méthodes qui correspondent le mieux au but de votre code. Par exemple, utilisez Single uniquement si vous devez vous assurer qu’un seul élément de la collection correspond à votre prédicat - sinon utilisez First ; comme Single lance une exception si la séquence a plus d'un élément correspondant. Ceci s'applique bien entendu aux partenaires "* OrDefault".

  • En ce qui concerne l’efficacité: Bien qu’il soit souvent approprié de s’assurer qu’il n’ya qu’un seul élément ( Single ) ou qu’un seul élément ou un seul SingleOrDefault ( SingleOrDefault ) renvoyé par une requête, ces deux méthodes requièrent plus, et souvent la totalité de la collection. à examiner pour s'assurer qu'il n'y a pas de seconde correspondance à la requête. Ceci est différent du comportement, par exemple, de la méthode First , qui peut être satisfaite après avoir trouvé la première correspondance.