Überprüfen Sie, ob die Liste in C # leer ist. [Geschlossen]

123

Ich habe eine Liste von Objekten aus einer Datenbank gefüllt. Ich muss eine Fehlermeldung anzeigen, wenn die Liste leer ist, und ansonsten eine Rasteransicht anzeigen.

Wie überprüfe ich, ob a List<T>in C # leer ist?

Lakshganga
quelle
9
Was ist also falsch an der Verwendung if (list.Count == 0) { /* ... */ }?
Bart van Nierop
11
Oderif (!list.Any())
Tharwen
10
Ich kann nicht verstehen, warum diese Frage abgelehnt wurde. Für mich ist es sehr spezifisch (OBJEKTLISTE). Hier gibt es nichts "Unklares". Diese Frage hat mehr als 30.000 Aufrufe. +1
MarceloBarbosa
2
Die Frage macht durchaus Sinn. "Ich muss eine Fehlermeldung anzeigen, wenn die Liste leer ist". Denken Sie daran, dass in der menschlichen Kommunikation nicht jeder Charakter wichtig ist.
Todd Painton
9
Dies ist auch das erste Google-Ergebnis, C# list isemptyfür das es vollständig zutreffend ist. Ich denke, irrelevante Teile der Frage sollten herausgeschnitten werden, und ich stimme dafür, wieder zu öffnen.
Felix Dombek

Antworten:

142

Warum nicht...

bool isEmpty = !list.Any();
if(isEmpty)
{
    // error message
}
else
{
    // show grid
}

Das GridViewhat auch eine, EmptyDataTemplatedie angezeigt wird, wenn die Datenquelle leer ist. Dies ist ein Ansatz in ASP.NET:

<emptydatarowstyle backcolor="LightBlue" forecolor="Red"/>

<emptydatatemplate>

  <asp:image id="NoDataErrorImg"
    imageurl="~/images/NoDataError.jpg" runat="server"/>

    No Data Found!  

</emptydatatemplate> 
Tim Schmelter
quelle
2
Hinweis: Der zweite Ansatz setzt ASP.NET voraus.
Tim Schmelter
2
Wäre es nicht am besten, list == nullzuerst zu prüfen, ob ?
4 ʙᴀᴋᴇʀ
2
@ ᴍᴀᴛᴛʙᴀᴋᴇʀ, var someList = new List <string> (); würde instanziiert werden (und daher nicht null sein), wäre aber leer von zu verarbeitenden Elementen
daviesdoesit
73

Wenn die von Ihnen verwendete IEnumerable<T>Listenimplementierung und Linq eine Option ist, können Sie Folgendes verwenden Any:

if (!list.Any()) {

}

Andernfalls haben Sie im Allgemeinen eine Lengthoder Count-Eigenschaft für Arrays bzw. Auflistungstypen.

Grant Thomas
quelle
10
Als kurze Anmerkung: Liste. Jeder hat eine viel bessere Leistung als zählen.
Adrian Lopez
2
@AdrianLopez: Kannst du das näher erläutern? Wenn Sie eine .Countoder .LengthEigenschaft wie bei haben, Listwas könnte .Any()möglicherweise schneller sein, als die Eigenschaft der Sammlung zu überprüfen, die die aktuelle Länge oder Anzahl verfolgt? Wenn Sie nur einen Enumerator haben, .Any()ist dieser natürlich schneller als .Count() > 0. Siehe auch: stackoverflow.com/questions/305092/… oder stackoverflow.com/questions/5741617/…
noox
2
@noox Wenn Sie sich die Quelle (.Net Core) ansehen, wird Anyüberprüft, ob das Abrufen der Zählung vor dem Testen billig ist. In Fällen, in denen Sie eine haben IListProvider<>, die die Zählung nicht verfolgt, wird sie stattdessen einmal aufgelistet.
NetMage
26
    If (list.Count==0){
      //you can show your error messages here
    } else {
      //here comes your datagridview databind 
    }

Sie können Ihr Datagrid falsch und im Abschnitt else sichtbar machen.

Kuzgun
quelle
@ NetMage So funktioniert das bei Listen nicht. Es ist eine O(1)Operation und es werden keine Iterationen zum Zählen von Elementen durchgeführt. Siehe List<T>.Count.
Spencer Wieczorek
@SpencerWieczorek Sie haben Recht, dieser Kommentar war sowohl alt als auch falsch :) Obwohl ich es im Allgemeinen immer noch vorziehen würde, Any()Absichten besser auszudrücken und performanter zu sein, wenn Sie nicht wissen, dass Sie eine tatsächliche haben List<T>.
NetMage
18

Was ist mit der Nutzung der CountEigenschaft.

 if(listOfObjects.Count != 0)
 {
     ShowGrid();
     HideError();
 }
 else
 {
     HideGrid();
     ShowError();
 }
Jeroen van Langen
quelle
3
Graf ist eine Eigenschaft, keine Methode
Moslem Ben Dhaou
5
@MoslemBenDhaou Hängt davon ab, ob es sich um die Linq-Erweiterungsmethode handelt, die verfügbar gemacht / aufgerufen wird, oder ob sie für das Objekt nativ ist.
Grant Thomas
@GrantThomas Ich habe es als List <T> -Objekt genommen, aber ja, Sie sind korrekt.
Moslem Ben Dhaou
Was ist, wenn listOfObjects null ist?
Sabri Meviş
2
@ SabriMeviş Eine von einer Methode zurückgegebene Sammlung / ienumerable / list sollte niemals sein null. Es sollte stattdessen eine leere Sammlung sein.
Jeroen van Langen
8

Sie sollten eine einfache IFAnweisung verwenden

List<String> data = GetData();

if (data.Count == 0)
    throw new Exception("Data Empty!");

PopulateGrid();
ShowGrid();
Moslem Ben Dhaou
quelle
Einfachster und bester Weg IMO.
Jabba
Wenn die Methode eine Null zurückgibt, schlägt die Count-Eigenschaft fehl. Berücksichtigen Sie den Nullreferenzprüfungsoperator "?", Um den Code kurz zu halten. Beispiel "if (data? .Count == 0) ..." oder die klassische Nullprüfung "if (data! = null && someOtherCondition) ....."
daviesdoesit
Fügen Sie den folgenden Code in eine dotnetfiddle ein und Sie sehen die System.NullReferenceException: Objektreferenz nicht auf eine Instanz eines Objekts festgelegt. using System; using System.Collections.Generic; public class Program { public static void Main() { List<string> stringList = null; if (stringList.Count == 0) { Console.WriteLine("no items in collection"); } } }
Daviesdoesit
6
var dataSource = lst!=null && lst.Any() ? lst : null;
// bind dataSource to gird source
TalentTuner
quelle
3

gridview selbst verfügt über eine Methode, mit der überprüft wird, ob die Datenquelle, an die Sie sie binden, leer ist, und mit der Sie etwas anderes anzeigen können.

Baahubali
quelle
0

Wenn Sie eine Rasteransicht verwenden, verwenden Sie die leere Datenvorlage: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.emptydatatemplate.aspx

      <asp:gridview id="CustomersGridView" 
        datasourceid="CustomersSqlDataSource" 
        autogeneratecolumns="true"
        runat="server">

        <emptydatarowstyle backcolor="LightBlue"
          forecolor="Red"/>

        <emptydatatemplate>

          <asp:image id="NoDataImage"
            imageurl="~/images/Image.jpg"
            alternatetext="No Image" 
            runat="server"/>

            No Data Found.  

        </emptydatatemplate> 

      </asp:gridview>
David MacCrimmon
quelle
Dies ist sehr ASP.NET-spezifisch.
Grant Thomas
Ich bin kein Winforms-Typ, aber kein Gridview-Asp.net-spezifischer Typ. Es ist eine Datagrid-Ansicht in Formularen?
David MacCrimmon