Vérifier si la liste est vide en C # [fermé]


125

J'ai une liste d'objets remplis à partir d'une base de données. J'ai besoin d'afficher un message d'erreur si la liste est vide et d'afficher une vue en grille dans le cas contraire.

Comment vérifier si a List<T>est vide en C #?


9
Alors, quel est le problème avec l'utilisation if (list.Count == 0) { /* ... */ }?
Bart van Nierop

11
Ouif (!list.Any())
Tharwen

10
Je ne comprends pas pourquoi cette question a été rejetée. Pour moi, c'est très spécifique (LISTE DES OBJETS). Il n'y a rien de "flou" ici. Cette question a plus de 30k vues. +1
MarceloBarbosa

2
La question est parfaitement logique. "J'ai besoin d'afficher un message d'erreur si la liste est vide". Rappelez-vous que dans la communication humaine, tous les personnages ne comptent pas.
Todd Painton

9
C'est également le résultat n ° 1 de Google C# list isemptypour lequel il est parfaitement pertinent. Je pense que les parties non pertinentes de la question devraient être supprimées, et je vote pour la réouverture.
Felix Dombek

Réponses:


143

Pourquoi pas...

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

Le GridViewa également un EmptyDataTemplatequi est affiché si la source de données est vide. Il s'agit d'une approche dans ASP.NET:

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

<emptydatatemplate>

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

    No Data Found!  

</emptydatatemplate> 

2
Remarque: la deuxième approche suppose ASP.NET.
Tim Schmelter

2
Ne serait-il pas préférable de vérifier si d' list == nullabord?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

2
@ ᴍᴀᴛᴛʙᴀᴋᴇʀ, var someList = new List <string> (); serait instancié (et donc pas nul) mais serait vide d'éléments à traiter
daviesdoesit

74

Si l'implémentation de liste que vous utilisez est IEnumerable<T>et que Linq est une option, vous pouvez utiliser Any:

if (!list.Any()) {

}

Sinon, vous avez généralement une propriété Lengthou Countsur les tableaux et les types de collection respectivement.


10
Comme note rapide: list.Any a de bien meilleures performances que count.
Adrian Lopez

2
@AdrianLopez: pouvez-vous nous en dire plus? Si vous avez une propriété .Countou .Lengthcomme avec, Listque pourriez .Any()-vous faire pour être plus rapide que de vérifier la propriété de la collection qui garde la trace de la longueur ou du nombre actuel? Si vous n'avez qu'un Enumérateur, alors .Any()est bien sûr plus rapide que .Count() > 0. Voir aussi: stackoverflow.com/questions/305092/… ou stackoverflow.com/questions/5741617/…
noox

2
@noox En regardant la source (.Net Core), il semble Anyvérifier que la récupération du compte est bon marché avant de le tester, dans les cas où vous avez un IListProvider<>qui ne suit pas le compte, il énumérera une fois à la place.
NetMage

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

Vous pouvez rendre votre datagrid visible false et la rendre visible dans la section else.


@NetMage Ce n'est pas comme ça que ça marche pour la liste. C'est une O(1)opération et aucune itération n'est effectuée pour compter les éléments. Voir List<T>.Count.
Spencer Wieczorek

@SpencerWieczorek Vous avez raison, ce commentaire était aussi vieux que faux :) Bien qu'en général, je préférerais toujours mieux Any()exprimer l'intention, tout en étant plus performant lorsque vous ne savez pas que vous avez un réel List<T>.
NetMage

18

Qu'en est-il de l'utilisation de la Countpropriété.

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

3
Le comte est une propriété pas une méthode
Moslem Ben Dhaou

5
@MoslemBenDhaou Dépend de savoir si c'est la méthode d'extension Linq exposée / appelée, ou native de l'objet.
Grant Thomas

@GrantThomas Je l'ai pris comme un objet List <T> mais oui vous avez raison.
Moslem Ben Dhaou

et si listOfObjects est nul?
Sabri Meviş

2
@ SabriMeviş une collection / ienumerable / list retournée par une méthode ne devrait jamais l'être null. Ce devrait être une collection vide à la place.
Jeroen van Langen

8

Vous devez utiliser une simple IFdéclaration

List<String> data = GetData();

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

PopulateGrid();
ShowGrid();

Le moyen le plus simple et le meilleur IMO.
Jabba

Si la méthode renvoie une valeur null, la propriété Count échouera. Pour garder le code concis, considérez l'opérateur de vérification des références nulles "?". Exemple "si (données? .Compte == 0)....." ou le contrôle nul classique "if (data! = null && someOtherCondition) ....."
daviesdoesit

Collez le code suivant dans un dotnetfiddle et vous verrez la System.NullReferenceException: Object reference not set to an instance of an object. 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

gridview lui-même a une méthode qui vérifie si la source de données à laquelle vous la liez est vide, elle vous permet d'afficher autre chose.


0

Si vous utilisez un gridview, utilisez le modèle de données vide: 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>

C'est très spécifique à ASP.NET.
Grant Thomas

Je ne suis pas un gars winforms mais je ne suis pas spécifique à gridview asp.net. C'est un datagridview sous forme?
David MacCrimmon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.