web-dev-qa-db-fra.com

ICollection - Obtenir une valeur unique

Quel est le meilleur moyen d’obtenir une valeur d’une ICollection? Nous savons que la collection est vide en dehors de cela. 

44
Udo Weber

Linq, bébé, ouais ...

   var foo = myICollection.OfType<YourType>().FirstOrDefault();
    // or use a query
    var bar = (from x in myICollection.OfType<YourType>() where x.SomeProperty == someValue select x)
       .FirstOrDefault();
69
Will

La manière la plus simple de faire ceci est:

foreach(object o in collection) {
  return o;
}

Mais ce n'est pas particulièrement efficace s'il s'agit en fait d'une collection générique, car IEnumerator implémente IDisposable. Le compilateur doit donc mettre un essai/un final, avec un appel Dispose () dans le bloc finally.

S'il s'agit d'une collection non générique ou si vous savez que la collection générique n'implémente rien dans sa méthode Dispose (), vous pouvez utiliser les éléments suivants:

IEnumerator en = collection.GetEnumerator();
en.MoveNext();
return en.Current;

Si vous savez si vous pouvez implémenter IList, vous pouvez le faire:

IList iList = collection as IList;
if (iList != null) {
  // Implements IList, so can use indexer
  return iList[0];
}
// Use the slower way
foreach (object o in collection) {
  return o;
}

De même, s'il est probable qu'il s'agisse d'un certain type de votre propre définition ayant un type d'accès indexé, vous pouvez utiliser la même technique.

17
Chris

Sans génériques et parce que ICollection implémente IEnumerable, vous pouvez faire comme dans l'exemple 1. Avec des génériques, vous devez simplement faire comme dans l'exemple 2:

List<string> l = new List<string>();
l.Add("astring");

ICollection col1 = (ICollection)l;
ICollection<string> col2 = (ICollection<string>)l;

//example 1
IEnumerator e1 = col1.GetEnumerator();
if (e1.MoveNext())
    Console.WriteLine(e1.Current);

//example 2
if (col2.Count != 0)
    Console.WriteLine(col2.Single());
3
bruno conde

.

collection.ToArray()[i]

Cette voie est lente, mais très simple à utiliser

1
mehrdad seyrafi

Si vous savez que votre collection ne contient qu'un seul élément et que vous ne devriez en avoir qu'un, vous pouvez utiliser la méthode d'extension Linq Single() .

Ceci convertit un ICollection<T> en un objet T contenant le seul élément de cette collection. Si la longueur de la collection est égale à 0 ou à plusieurs, la variable InvalidOperationException est lancée.

0
JAD