Controlla se l'elenco è vuoto in C # [chiuso]


125

Ho un elenco di oggetti popolati da un database. Devo visualizzare un messaggio di errore se l'elenco è vuoto e visualizzare una visualizzazione griglia in caso contrario.

Come posso verificare se a List<T>è vuoto in C #?


9
Allora cosa c'è di sbagliato nell'usare if (list.Count == 0) { /* ... */ }?
Bart van Nierop

11
Oppureif (!list.Any())
Tharwen

10
Non riesco a capire perché questa domanda sia stata sottovalutata. Per me è molto specifico (ELENCO OGGETTI). Non c'è niente di "poco chiaro" qui. Questa domanda ha più di 30k visualizzazioni. +1
MarceloBarbosa

2
La domanda ha perfettamente senso. "Devo visualizzare un messaggio di errore se l'elenco è vuoto". Ricorda nella comunicazione umana, non tutti i personaggi sono importanti.
Todd Painton

9
Questo è anche il risultato di Google n. 1 C# list isemptyper il quale è completamente perfetto. Penso che le parti irrilevanti della domanda dovrebbero essere eliminate e voto per riaprire.
Felix Dombek

Risposte:


142

Perchè no...

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

Il GridViewha anche una EmptyDataTemplateche viene visualizzata se l'origine dati è vuota. Questo è un approccio in ASP.NET:

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

<emptydatatemplate>

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

    No Data Found!  

</emptydatatemplate> 

2
Nota: il secondo approccio presume ASP.NET.
Tim Schmelter

2
Non sarebbe meglio controllare se list == nullprima?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

2
@ ᴍᴀᴛᴛʙᴀᴋᴇʀ, var someList = new List <string> (); sarebbe istanziato (e quindi non sarebbe nullo) ma sarebbe vuoto di elementi da elaborare
daviesdoesit

74

Se l'implementazione dell'elenco che stai utilizzando è IEnumerable<T>e Linq è un'opzione, puoi utilizzare Any:

if (!list.Any()) {

}

Altrimenti generalmente hai una proprietà Lengtho rispettivamente Countsugli array e sui tipi di raccolta.


10
Come nota rapida: list. Any ha prestazioni molto migliori del conteggio.
Adrian Lopez

2
@AdrianLopez: puoi approfondire questo? Se hai una proprietà .Counto .Lengthcome con Listcosa potresti .Any()fare per essere più veloce che controllare la proprietà della raccolta che tiene traccia della lunghezza o del conteggio corrente? Se hai solo un enumeratore, .Any()è ovviamente più veloce di .Count() > 0. Vedi anche: stackoverflow.com/questions/305092/... o stackoverflow.com/questions/5741617/...
Noox

2
@noox Guardando la fonte (.Net Core), sembra che Anycontrolli per convalidare che il recupero del conteggio sia economico prima di testarlo, nei casi in cui si dispone di un IListProvider<>che non tiene traccia del conteggio, verrà enumerato una volta.
NetMage

26
    If (list.Count==0){
      //you can show your error messages here
    } else {
      //here comes your datagridview databind 
    }

Puoi rendere il tuo datagrid visibile falso e renderlo visibile nella sezione else.


@NetMage Non è così che funziona per list. È O(1)un'operazione e non vengono eseguite iterazioni per il conteggio degli elementi. Vedi List<T>.Count.
Spencer Wieczorek

@SpencerWieczorek Hai ragione, quel commento era vecchio e sbagliato :) Anche se in generale, preferirei comunque Any()esprimere meglio l'intento, oltre ad essere più performante quando non sai di avere un reale List<T>.
NetMage

18

Che dire dell'utilizzo della Countproprietà.

 if(listOfObjects.Count != 0)
 {
     ShowGrid();
     HideError();
 }
 else
 {
     HideGrid();
     ShowError();
 }

3
Il conteggio è una proprietà, non un metodo
Moslem Ben Dhaou

5
@MoslemBenDhaou Dipende dal fatto che sia il metodo di estensione Linq esposto / chiamato o nativo dell'oggetto.
Grant Thomas,

@GrantThomas L'ho preso come un oggetto List <T> ma sì, hai ragione.
Moslem Ben Dhaou

cosa succede se listOfObjects è null?
Sabri Meviş

2
@ SabriMeviş una collection / ienumerable / list restituita da un metodo non dovrebbe mai essere null. Dovrebbe invece essere una raccolta vuota.
Jeroen van Langen

8

Dovresti usare una semplice IFdichiarazione

List<String> data = GetData();

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

PopulateGrid();
ShowGrid();

Modo più semplice e migliore IMO.
Jabba

Se il metodo restituisce un valore null, la proprietà Count avrà esito negativo. Per mantenere il codice conciso, si consideri l'operatore di controllo dei riferimenti nulli "?". Esempio "if (data? .Count == 0)....." o il classico controllo nullo "if (data! = null && someOtherCondition) ....."
daviesdoesit

Incolla il codice seguente in un dotnetfiddle e vedrai System.NullReferenceException: riferimento oggetto non impostato su un'istanza di un oggetto. 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

3

Lo stesso gridview ha un metodo che controlla se l'origine dati a cui lo stai associando è vuota, ti consente di visualizzare qualcos'altro.


0

Se stai utilizzando un gridview, utilizza il modello di dati vuoto: 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>

Questo è molto specifico per ASP.NET.
Grant Thomas,

Non sono un winforms ragazzi ma non sono uno specifico per asp.net gridview. È un datagridview nei moduli?
David MacCrimmon
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.