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

lakshganga
fuente
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> 
Tim Schmelter
fuente
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.

Grant Thomas
fuente
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.

Kuzgun
fuente
@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();
 }
Jeroen van Langen
fuente
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();
Musulmán Ben Dhaou
fuente
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
TalentTuner
fuente
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.

Baahubali
fuente
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>
David MacCrimmon
fuente
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