Quel est le meilleur moyen d’obtenir une valeur d’une ICollection? Nous savons que la collection est vide en dehors de cela.
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();
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.
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());
.
collection.ToArray()[i]
Cette voie est lente, mais très simple à utiliser
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.