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 #?


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> 

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.


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.


@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();
 }

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();

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

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.


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>

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.