Compruebe si la lista está vacía en C # [cerrado]


125

Tengo una lista de objetos poblados de una base de datos. Necesito mostrar un mensaje de error si la lista está vacía y mostrar una vista de cuadrícula de lo contrario.

¿Cómo verifico si a List<T>está vacío en C #?


9
Entonces, ¿qué tiene de malo usar if (list.Count == 0) { /* ... */ }?
Bart van Nierop

11
Oif (!list.Any())
Tharwen

10
No puedo entender por qué se ha rechazado esta pregunta. Para mí es muy específico (LISTA DE OBJETOS). No hay nada "Poco claro" aquí. Esta pregunta tiene más de 30 mil visitas. +1
MarceloBarbosa

2
La pregunta tiene perfecto sentido. "Necesito mostrar un mensaje de error si la lista está vacía". Recuerde que en la comunicación humana, no todos los personajes importan.
Todd Painton

9
Este es también el resultado número uno de Google C# list isemptypara el que está completamente en el punto. Creo que las partes irrelevantes de la pregunta deberían eliminarse y votaré para reabrir.
Felix Dombek

Respuestas:


142

Por qué no...

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

También GridViewtiene un EmptyDataTemplateque se muestra si la fuente de datos está vacía. Este es un enfoque en ASP.NET:

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

<emptydatatemplate>

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

    No Data Found!  

</emptydatatemplate> 

2
Nota: el segundo enfoque presupone ASP.NET.
Tim Schmelter

2
¿No sería mejor comprobar si list == nullprimero?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

2
@ ᴍᴀᴛᴛʙᴀᴋᴇʀ, var someList = nueva lista <cadena> (); se crearía una instancia (y, por lo tanto, no sería nulo) pero estaría vacío de elementos para procesar
daviesdoesit

74

Si la implementación de la lista que está usando es IEnumerable<T>y Linq es una opción, puede usar Any:

if (!list.Any()) {

}

De lo contrario, generalmente tiene una propiedad Lengtho Counten matrices y tipos de colección, respectivamente.


10
Como nota rápida: list.Any tiene un rendimiento mucho mejor que contar.
Adrian Lopez

2
@AdrianLopez: ¿puedes dar más detalles sobre eso? Si tiene una propiedad .Counto .Length, List¿qué podría .Any()hacer para ser más rápido que verificar la propiedad de la colección que realiza un seguimiento de la longitud o recuento actual? Si solo tiene un enumerador, entonces, .Any()por supuesto , es más rápido que .Count() > 0. Ver también: stackoverflow.com/questions/305092/… o stackoverflow.com/questions/5741617/…
noox

2
@noox Mirando la fuente (.Net Core), parece que Anyverifica para validar que recuperar el recuento es barato antes de probarlo, en los casos en los que tenga un IListProvider<>que no rastrea el recuento, se enumerará una vez.
NetMage

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

Puede hacer que su cuadrícula de datos sea visible falsa y hacerla visible en la sección else.


@NetMage No es así como funciona para la lista. Es una O(1)operación y no se realizan iteraciones para contar elementos. Ver List<T>.Count.
Spencer Wieczorek

@SpencerWieczorek Tienes razón, ese comentario era antiguo y erróneo :) Aunque, en general, prefiero Any()expresar mejor la intención, además de ser más eficaz cuando no sabes que tienes una List<T>.
NetMage

18

¿Qué pasa con el uso de la Countpropiedad?

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

3
El conteo es una propiedad, no un método
Moslem Ben Dhaou

5
@MoslemBenDhaou Depende de si se trata del método de extensión Linq expuesto / al que se llama o si es nativo del objeto.
Grant Thomas

@GrantThomas Lo tomé como un objeto List <T> pero sí, tienes razón.
Moslem Ben Dhaou

¿Qué pasa si listOfObjects es nulo?
Sabri Meviş

2
@ SabriMeviş, una colección / ienumerable / lista devuelta desde un método nunca debería ser null. En su lugar, debería ser una colección vacía.
Jeroen van Langen

8

Deberías usar una IFdeclaración simple

List<String> data = GetData();

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

PopulateGrid();
ShowGrid();

En mi opinión, la forma más sencilla y mejor.
Jabba

Si el método devuelve un valor nulo, la propiedad Count fallará. Para mantener el código conciso, considere el operador de verificación de referencia nula "?". Ejemplo "if (data? .Count == 0)....." o el cheque nulo clásico "if (data! = null && someOtherCondition) ....."
daviesdoesit

Pegue el siguiente código en un dotnetfiddle y verá System.NullReferenceException: referencia de objeto no establecida en una instancia de un objeto. 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 en sí tiene un método que verifica si la fuente de datos a la que lo vincula está vacía, le permite mostrar algo más.


0

Si está usando una vista de cuadrícula, use la plantilla de datos vacía: 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>

Esto es muy específico de ASP.NET.
Grant Thomas

No soy un tipo de winforms pero no soy específico de gridview asp.net. ¿Es una vista de cuadrícula de datos en formularios?
David MacCrimmon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.