Sprawdź, czy lista jest pusta w C # [zamknięta]

125

Mam listę obiektów wypełnionych z bazy danych. Muszę wyświetlić komunikat o błędzie, jeśli lista jest pusta, aw przeciwnym razie wyświetlić widok siatki.

Jak sprawdzić, czy a List<T>jest pusty w C #?

lakshganga
źródło
9
Więc co jest złego w używaniu if (list.Count == 0) { /* ... */ }?
Bart van Nierop
11
Lubif (!list.Any())
Tharwen
10
Nie mogę zrozumieć, dlaczego to pytanie zostało odrzucone. Dla mnie to bardzo specyficzne (LISTA OBIEKTÓW). Nie ma tu nic „niejasnego”. To pytanie ma ponad 30 tys. Wyświetleń. +1
MarceloBarbosa
2
Pytanie ma sens. „Muszę wyświetlić komunikat o błędzie, jeśli lista jest pusta”. Pamiętaj, że w komunikacji międzyludzkiej nie każdy charakter ma znaczenie.
Todd Painton
9
Jest to również wynik nr 1 w Google, C# list isemptydla którego jest całkowicie trafny. Uważam, że nieistotne części pytania powinny zostać usunięte i głosuję za ponownym otwarciem.
Felix Dombek

Odpowiedzi:

143

Dlaczego nie...

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

GridViewMa także EmptyDataTemplatektóre jest wyświetlane, jeśli źródło danych jest pusta. To jest podejście w ASP.NET:

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

<emptydatatemplate>

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

    No Data Found!  

</emptydatatemplate> 
Tim Schmelter
źródło
2
Uwaga: drugie podejście zakłada, że ​​ASP.NET.
Tim Schmelter,
2
Czy nie byłoby najlepiej sprawdzić, czy list == nullnajpierw?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
2
@ ᴍᴀᴛᴛʙᴀᴋᴇʀ, var someList = new List <string> (); zostałby utworzony (i dlatego nie byłby zerowy), ale byłby pozbawiony elementów do przetworzenia
daviesdoesit
74

Jeśli implementacja listy, której używasz, jest, IEnumerable<T>a Linq jest opcją, możesz użyć Any:

if (!list.Any()) {

}

W przeciwnym razie zazwyczaj masz właściwość Lengthlub odpowiednio Countdla tablic i typów kolekcji.

Grant Thomas
źródło
10
Krótka uwaga: lista.Any ma znacznie lepszą wydajność niż liczenie.
Adrian Lopez
2
@AdrianLopez: czy możesz to rozwinąć? Jeśli masz właściwość .Countlub, co można zrobić, aby być szybszym niż sprawdzenie właściwości kolekcji, która śledzi aktualną długość lub liczbę? Jeśli masz tylko Enumerator, jest to oczywiście szybsze niż . Zobacz też: stackoverflow.com/questions/305092/… lub stackoverflow.com/questions/5741617/….LengthList.Any().Any().Count() > 0
noox
2
@noox Patrząc na źródło (.Net Core), wygląda na to, że Anysprawdza, czy pobieranie liczby jest tanie przed jej przetestowaniem, w przypadkach, gdy masz element IListProvider<>, który nie śledzi liczby, wyliczy zamiast tego raz.
NetMage
26
    If (list.Count==0){
      //you can show your error messages here
    } else {
      //here comes your datagridview databind 
    }

Możesz sprawić, że twój datagrid będzie widoczny jako fałszywy i będzie widoczny w sekcji else.

Kuzgun
źródło
@NetMage Tak to nie działa w przypadku list. To O(1)operacja i nie ma żadnych iteracji wykonywanych w celu zliczania elementów. Zobacz List<T>.Count.
Spencer Wieczorek
@SpencerWieczorek Masz rację, ten komentarz był zarówno stary, jak i zły :) Choć generalnie wolałabym Any()lepiej wyrażać intencje, a także być bardziej wydajnym, gdy nie wiesz, że masz rzeczywisty List<T>.
NetMage
18

A co z korzystaniem z Countnieruchomości.

 if(listOfObjects.Count != 0)
 {
     ShowGrid();
     HideError();
 }
 else
 {
     HideGrid();
     ShowError();
 }
Jeroen van Langen
źródło
3
Liczenie to właściwość, a nie metoda
muzułmanin Ben Dhaou
5
@MoslemBenDhaou Zależy od tego, czy jest to ujawniona / wywoływana metoda rozszerzenia Linq, czy natywna dla obiektu.
Grant Thomas
@GrantThomas Wziąłem to jako obiekt List <T>, ale tak, masz rację.
Muzułmanin Ben Dhaou
co jeśli listOfObjects ma wartość null?
Sabri Meviş
2
@ SabriMeviş kolekcja / ienumerable / lista zwrócona przez metodę nigdy nie powinna być null. Zamiast tego powinna to być pusta kolekcja.
Jeroen van Langen
8

Powinieneś użyć prostego IFstwierdzenia

List<String> data = GetData();

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

PopulateGrid();
ShowGrid();
Muzułmanin Ben Dhaou
źródło
Najprostszy i najlepszy sposób IMO.
Jabba
Jeśli metoda zwróci wartość null, właściwość Count zakończy się niepowodzeniem. Aby kod był zwięzły, rozważ operator sprawdzania odwołania zerowego „?”. Przykład „if (dane? .Count == 0)....” lub klasyczne sprawdzenie wartości null "if (data! = null && someOtherCondition) ....."
daviesdoesit
Wklej następujący kod do dotnetfiddle, a zobaczysz System.NullReferenceException: odwołanie do obiektu nie jest ustawione na wystąpienie obiektu. 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
źródło
3

Sam gridview ma metodę, która sprawdza, czy źródło danych, z którym jest powiązany, jest puste, pozwala wyświetlić coś innego.

Baahubali
źródło
0

Jeśli używasz widoku siatki, użyj pustego szablonu danych: 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
źródło
Jest to bardzo specyficzne dla ASP.NET.
Grant Thomas
Nie jestem facetem od Winforms, ale nie jest specyficzna dla asp.net Gridview. Czy to datagridview w formularzach?
David MacCrimmon