J'ai une liste où parfois il est vide ou nul. Je veux pouvoir vérifier s'il contient un élément de la liste et sinon ajouter un objet à la liste.
// I have a list, sometimes it doesn't have any data added to it
var myList = new List<object>();
// Expression is always false
if (myList == null)
Console.WriteLine("List is never null");
if (myList[0] == null)
myList.Add("new item");
//Errors encountered: Index was out of range. Must be non-negative and less than the size of the collection.
// Inner Exception says "null"
Essayez le code suivant:
if ( (myList!= null) && (!myList.Any()) )
{
// Add new item
myList.Add("new item");
}
Un EDIT tardif car pour ces vérifications, j’aimerais maintenant utiliser la solution suivante ..__ Tout d’abord, ajoutez une petite méthode d’extension réutilisable appelée Safe ():
public static class IEnumerableExtension
{
public static IEnumerable<T> Safe<T>(this IEnumerable<T> source)
{
if (source == null)
{
yield break;
}
foreach (var item in source)
{
yield return item;
}
}
}
Et ensuite, vous pouvez faire la même chose comme:
if (!myList.Safe().Any())
{
// Add new item
myList.Add("new item");
}
Personnellement, je trouve cela moins verbeux et plus facile à lire. Vous pouvez maintenant accéder en toute sécurité à n'importe quelle collection sans avoir besoin d'un contrôle nul.
Pour les personnes qui n'ont pas la garantie que la liste not ne sera pas nulle, vous pouvez utiliser l'opérateur null-conditionnel pour vérifier en toute sécurité les listes nulles et vides dans une seule instruction conditionnelle:
if (list?.Any() != true)
{
// Handle null or empty list
}
Une réponse moins efficace:
if(myList.Count == 0){
// nothing is there. Add here
}
Fondamentalement, new List<T>
ne sera pas null
mais n'aura aucun élément. Comme indiqué dans les commentaires, ce qui précède lève une exception si la liste n'est pas instanciée. Mais en ce qui concerne l'extrait de code dans la question, où il est instancié, ce qui précède fonctionnera parfaitement.
Si vous devez vérifier null, alors ce serait:
if(myList != null && myList.Count == 0){
// The list is empty. Add something here
}
Encore mieux serait d'utiliser !myList.Any()
et, comme mentionné dans la réponse de L-Four susmentionnée, le court-circuitage est plus rapide que le comptage linéaire des éléments de la liste.
Qu'en est-il de l'utilisation d'une méthode d'extension?
public static bool AnyOrNotNull<T>(this IEnumerable<T> source)
{
if (source != null && source.Any())
return true;
else
return false;
}
En supposant que la liste n'est jamais nulle, le code suivant vérifie si la liste est vide et ajoute un nouvel élément s'il est vide:
if (!myList.Any())
{
myList.Add("new item");
}
S'il est possible que la liste soit nulle, une vérification NULL doit être ajoutée avant la condition Any()
:
if (myList != null && !myList.Any())
{
myList.Add("new item");
}
À mon avis, utiliser Any()
au lieu de Count == 0
est préférable car il exprime mieux l'intention de vérifier si la liste contient un élément ou si elle est vide . Cependant, compte tenu des performances de chaque approche, l'utilisation de Any()
est généralement lent que Count
.
Votre liste n'a pas d'article , c'est pourquoi l'accès à n'existe pas 0ème article
myList[0] == null
jette Index était hors limite exception ; quand vous voulez accéder à n-ème vérification de poste
if (myList.Count > n)
DoSomething(myList[n])
dans ton cas
if (myList.Count > 0) // <- You can safely get 0-th item
if (myList[0] == null)
myList.Add("new item");
Si vous souhaitez une condition de ligne unique vérifiant à la fois les valeurs null et vide, vous pouvez utiliser
if (list == null ? true : (!list.Any()))
Cela fonctionnera dans les versions précédentes de la structure où l'opérateur null-conditionnel n'est pas disponible.
List
dans c#
a une propriété Count
. Il peut être utilisé comme suit:
if(myList == null) // Checks if list is null
// Wasn't initialized
else if(myList.Count == 0) // Checks if the list is empty
myList.Add("new item");
else // List is valid and has something in it
// You could access the element in the list if you wanted
myList[0]
obtient le premier élément de la liste. Comme la liste est vide, il n’ya pas d’objet à obtenir et vous obtenez plutôt IndexOutOfRangeException
.
Comme l’ont montré d’autres réponses, afin de vérifier si la liste est vide, vous devez obtenir le nombre d’éléments dans la liste (myList.Count
) ou utiliser la méthode LINQ .Any()
, qui renvoie true si la liste contient des éléments.
Je me demandais si personne ne suggérait de créer un nom plus lisible pour la méthode d’extension propre à OP.
public static bool IsNullOrEmpty<T>(this IEnumerable<T> source)
{
if (source == null)
{
return true;
}
return source.Any() == false;
}
Essayez et utilisez:
if(myList.Any())
{
}
Remarque: cela suppose que ma liste n'est pas nulle.
Parce que vous initialisez myList avec 'new', la liste elle-même ne sera jamais nulle.
Mais il peut être rempli avec des valeurs 'nulles'.
Dans ce cas, .Count > 0
et .Any()
seront vrais. Vous pouvez vérifier cela avec la .All(s => s == null)
var myList = new List<object>();
if (myList.Any() || myList.All(s => s == null))
if (myList?.Any() == true)
{
...
}
Je trouve cela le moyen le plus pratique. '== true' vérifie la valeur du booléen nullable impliqué par '? .Any ()
Nous pouvons valider comme ci-dessous avec les méthodes d'extension. Je les utilise pour tous mes projets.
var myList = new List<string>();
if(!myList.HasValue())
{
Console.WriteLine("List has value(s)");
}
if(!myList.HasValue())
{
Console.WriteLine("List is either null or empty");
}
if(myList.HasValue())
{
if (!myList[0].HasValue())
{
myList.Add("new item");
}
}
/// <summary>
/// This Method will return True if List is Not Null and it's items count>0
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="items"></param>
/// <returns>Bool</returns>
public static bool HasValue<T>(this IEnumerable<T> items)
{
if (items != null)
{
if (items.Count() > 0)
{
return true;
}
}
return false;
}
/// <summary>
/// This Method will return True if List is Not Null and it's items count>0
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="items"></param>
/// <returns></returns>
public static bool HasValue<T>(this List<T> items)
{
if (items != null)
{
if (items.Count() > 0)
{
return true;
}
}
return false;
}
/// <summary>
/// This method returns true if string not null and not empty
/// </summary>
/// <param name="ObjectValue"></param>
/// <returns>bool</returns>
public static bool HasValue(this string ObjectValue)
{
if (ObjectValue != null)
{
if ((!string.IsNullOrEmpty(ObjectValue)) && (!string.IsNullOrWhiteSpace(ObjectValue)))
{
return true;
}
}
return false;
}
Vous pouvez utiliser la propriété Count de List en c #
s'il vous plaît trouver ci-dessous le code qui liste de contrôle vide et null à la fois dans une seule condition
if(myList == null || myList.Count == 0)
{
//Do Something
}
Nous pouvons ajouter une extension pour créer une liste vide
public static IEnumerable<T> Nullable<T>(this IEnumerable<T> obj)
{
if (obj == null)
return new List<T>();
else
return obj;
}
Et utiliser comme ça
foreach (model in models.Nullable())
{
....
}