108 votes

Vérifier si l'élément à la position [x] existe dans la liste.

Si j'ai une liste de chaînes de caractères

List<String> list = new list<String>();
list.add("str1");
list.add("str2");
list.add("str3");

et je veux savoir si, par exemple, la position 2 de l'index contient un élément. Existe-t-il un moyen simple de le faire sans compter la longueur de la liste ou utiliser un try catch ?

Comme cela va échouer, je peux le contourner avec un try catch, mais cela semble excessif.

if(list.ElementAt(2) != null)
{
   // logic
}

268voto

Yuriy Faktorovich Points 33347
if(list.ElementAtOrDefault(2) != null)
{
   // logic
}

ElementAtOrDefault() fait partie de la fonction System.Linq espace de noms.

Bien que vous ayez une Liste, vous pouvez donc utiliser list.Count > 2 .

4 votes

Plus rapide à lire que la vérification régulière de .Count, mais veuillez noter que les éléments "null" sont théoriquement valides à l'intérieur de la liste, donc ne comptez pas sur cette vérification pour lancer une exception si le test n'est pas satisfait.

2 votes

Vous pouvez utiliser le ? ?? opérateur ie. list.ElementAtOrDefault(2)??defaultvalue

1 votes

Et si la liste est un List<string> ou un List<int?> ? Et si l'élément à l'index 2 existe, mais a la valeur de null ? null ne signifie pas qu'il n'y a pas d'élément 2.

12voto

Anthony Pegram Points 58528
if (list.Count > desiredIndex && list[desiredIndex] != null)
{
    // logic
}

6 votes

Même si list.Count > desiredIndex est satisfait, la récupération de l'élément lèvera une exception si index < 0

2 votes

Eh bien, c'est du chipotage. desiredIndex sera probablement un nombre positif. Si cette affirmation n'est pas fiable, ajoutez simplement desiredIndex > -1

2 votes

@SubjectX - Pas de pinaillage. Il est courant d'utiliser un indice renvoyé par IndexOf qui peut être -1

0voto

Suamere Points 694

Le problème que le PO essaie d'aborder est que Count() devra utiliser l'énumérateur pour MoveNext() à travers l'ensemble IEnumerator collection. L'avantage de IEnumerable est que nous devrions être en mesure d'arrêter l'énumération lorsque nous atteignons un certain prédicat d'informations connues.

Le problème que j'ai souligné avec les autres réponses est que null est une valeur valide dans n'importe quelle collection. Ainsi, pour vérifier si GetElementAt...() es null n'est pas fiable.

J'ai une mise en œuvre et une exigence différentes, mais je l'ai modifiée pour ajouter une réponse à cette question spécifique :

public bool TryElementAtOrDefault<T>(IEnumerable<T> source, int index, out T value)
{
    value = default;
    if (index < 0 || source == null || source.Any() == false) return false;

    if (source is IList<T> list && index < list.Count)
    {
        value = list[index];
        return true;
    }

    using (var e = source.GetEnumerator())
    {
        while (e.MoveNext())
        {
            if (index == 0)
            {
                value = e.Current;
                return true;
            }
            index--;
        }
    }

    return false;
}

0voto

Inspiré par la réponse de Yuriy Faktorovich, je l'ai utilisée. Je la poste ici au cas où elle aiderait quelqu'un à l'avenir.

public static bool TryGetElementByIndex<T>(this List<T> list, int index, out T element)
{
    var e = list.ElementAtOrDefault(index);
    if (e != null)
    {
        element = e;
        return true;
    }

    element = default;
    return false;
}

0voto

InGeek Points 1932
int? here = (list.ElementAtOrDefault(2) != 0 ? list[2]:(int?) null);

5 votes

Les réponses uniquement codées sont déconseillées car elles n'expliquent pas comment elles résolvent le problème. Veuillez mettre à jour votre réponse afin d'expliquer comment elle améliore les autres réponses acceptées et approuvées pour cette question. De plus, cette question est vieille de 7 ans, vos efforts seraient plus appréciés par les utilisateurs qui ont des questions récentes sans réponse. Veuillez revoir Comment rédiger une bonne réponse .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X