ICollection – Obtenir une valeur unique

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

    Linq, bébé, oui …

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

    La manière la plus simple de procéder est la suivante:

     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, de sorte que le compilateur doit faire un try / finally, 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 peut 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 que ce soit un certain type de votre propre définition avec un certain type d’access 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 les génériques, vous devez simplement faire comme dans l’exemple 2:

     List l = new List(); l.Add("assortingng"); ICollection col1 = (ICollection)l; ICollection col2 = (ICollection)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, ne devrait avoir qu’un seul élément, vous pouvez utiliser la méthode d’extension Linq Single() .

    Cela convertit un ICollection en un object T contenant l’élément unique de cette collection. Si la longueur de la collection est égale à 0 ou supérieure à plusieurs, une InvalidOperationException sera lancée.