web-dev-qa-db-de.com

Auf leere oder leere Liste <string> prüfen

Ich habe eine Liste, in der sie manchmal leer oder null ist. Ich möchte in der Lage sein zu überprüfen, ob es ein Listenelement enthält, und wenn nicht, dann ein Objekt zur Liste hinzufügen.

 // 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"
33

Versuchen Sie den folgenden Code:

 if ( (myList!= null) && (!myList.Any()) )
 {
     // Add new item
     myList.Add("new item"); 
 }

Ein spätes EDIT, weil ich für diese Prüfungen jetzt die folgende Lösung verwenden möchte: __ Fügen Sie zunächst eine kleine wiederverwendbare Erweiterungsmethode namens Safe () hinzu:

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;
        }
    }
}

Und dann kannst du dasselbe machen:

 if (!myList.Safe().Any())
 {
      // Add new item
      myList.Add("new item"); 
 }

Ich persönlich finde das weniger ausführlich und einfacher zu lesen. Sie können jetzt sicher auf jede Sammlung zugreifen, ohne dass eine Nullprüfung erforderlich ist.

46
L-Four

Für jeden, der nicht die Garantie hat, dass die Liste nicht null ist, können Sie den null-bedingten Operator verwenden, um in einer einzigen bedingten Anweisung sicher nach Null- und leeren Listen zu suchen:

if (list?.Any() != true)
{
    // Handle null or empty list
}
31
mech

Kasse L-Four's Antwort.

Eine weniger effiziente Antwort:

if(myList.Count == 0){
    // nothing is there. Add here
}

Grundsätzlich ist new List<T> nicht null, hat aber keine Elemente. Wie in den Kommentaren erwähnt, wird oben eine Ausnahme ausgelöst, wenn die Liste nicht belegt ist. Aber was das Snippet in der Frage angeht, wo es instanziiert wird, wird das obige Problem gut funktionieren.

Wenn Sie nach Null suchen müssen, wäre dies:

if(myList != null && myList.Count == 0){
  // The list is empty. Add something here
}

Noch besser wäre es, !myList.Any() zu verwenden, und wie in der oben genannten Antwort von L-Four erwähnt, ist das Kurzschließen schneller als das lineare Zählen der Elemente in der Liste.

19
Amit Joki

Was ist mit einer Erweiterungsmethode?

public static bool AnyOrNotNull<T>(this IEnumerable<T> source)
{
  if (source != null && source.Any())
    return true;
  else
    return false;
}
12
swissben

Unter der Annahme, dass die Liste niemals NULL ist, prüft der folgende Code, ob die Liste leer ist, und fügt ein neues Element hinzu, wenn es leer ist:

if (!myList.Any())
{
    myList.Add("new item");
}

Wenn es möglich ist, dass die Liste null ist, muss vor der Any()-Bedingung eine Nullprüfung hinzugefügt werden:

if (myList != null && !myList.Any())
{
    myList.Add("new item");
}

Meines Erachtens ist die Verwendung von Any() anstelle von Count == 0 vorzuziehen, da dies besser die Absicht ausdrückt, zu prüfen, ob die Liste ein Element enthält oder leer ist .. Wenn man jedoch die Leistung jedes Ansatzes berücksichtigt, ist Any() im Allgemeinen langsamer als Count.

6
Luca Cremonesi

Ihre Liste hat keine Elemente , deshalb Zugriff auf nicht vorhandene 0te Position 

myList[0] == null

würfe Index war außerhalb des zulässigen Bereichs ; wenn Sie auf n-te Artikelcheck zugreifen möchten

  if (myList.Count > n)
    DoSomething(myList[n])

in Ihrem Fall

  if (myList.Count > 0) // <- You can safely get 0-th item
    if (myList[0] == null) 
      myList.Add("new item");
3
Dmitry Bychenko

Wenn Sie eine einzeilige Bedingung wünschen, die sowohl null als auch leer prüft, können Sie verwenden

if (list == null ? true : (!list.Any()))

Dies funktioniert in älteren Framework-Versionen, in denen der Operator mit NULL-Bedingungen nicht verfügbar ist.

3
johnnydanger

List in c# verfügt über eine Count-Eigenschaft. Es kann wie folgt verwendet werden:

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
2
Andrew_CS

myList[0] erhält den ersten Eintrag in der Liste. Da die Liste leer ist, kann kein Element abgerufen werden. Stattdessen wird IndexOutOfRangeException angezeigt.

Wie andere Antworten hier gezeigt haben, müssen Sie, um zu überprüfen, ob die Liste leer ist, die Anzahl der Elemente in der Liste (myList.Count) abrufen oder die LINQ-Methode .Any() verwenden, die true zurückgibt, wenn Elemente in der Liste vorhanden sind.

2
Andrew Cooper

Ich wunderte mich, niemand schlug vor, einen eigenen lesbaren Namen für den Fall von OP zu erstellen.

public static bool IsNullOrEmpty<T>(this IEnumerable<T> source)
{
    if (source == null)
    {
        return true;
    }

    return source.Any() == false;
}
1
Basin

Versuchen und nutzen Sie: 

if(myList.Any())
{

}

Hinweis: Diese Annahme, myList ist nicht null.

Da Sie myList mit 'new' initialisieren, wird die Liste selbst niemals null sein.

Es kann aber auch mit 'Null'-Werten gefüllt werden. 

In diesem Fall sind .Count > 0 und .Any() wahr. Sie können dies mit der .All(s => s == null) überprüfen.

var myList = new List<object>();
if (myList.Any() || myList.All(s => s == null))
0
Tessa
if (myList?.Any() == true) 
{
   ...
}

Ich finde das am bequemsten. '== true' prüft den Wert des durch '? .Any ()

0
bvh9000

Wir können wie folgt mit Erweiterungsmethoden validieren. Ich verwende sie für alle meine Projekte.

  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;
}
0
Anandha

Sie können die Count-Eigenschaft von List in c # verwenden.

untenstehend finden Sie einen Code, der sowohl die leere als auch die leere Liste in einer einzigen Bedingung überprüft 

if(myList == null || myList.Count == 0)
{
    //Do Something 
}
0
Niraj Trivedi

Eine einfache Möglichkeit, myList == null || myList.Count == 0 Zu kombinieren, ist die Verwendung des Null-Koaleszenzoperators ??:

if ((myList?.Count ?? 0) == 0) {
    //My list is null or empty
}
0
Mattkwish

Wir können eine Erweiterung hinzufügen, um eine leere Liste zu erstellen 

    public static IEnumerable<T> Nullable<T>(this IEnumerable<T> obj)
    {
        if (obj == null)
            return new List<T>();
        else
            return obj;
    }

Und so verwenden

foreach (model in models.Nullable())
{
    ....
}
0
Damian Haynes