Verifique se a lista está vazia em C # [fechado]


123

Eu tenho uma lista de objetos preenchidos a partir de um banco de dados. Preciso exibir uma mensagem de erro se a lista estiver vazia e exibir uma exibição em grade caso contrário.

Como verifico se a List<T>está vazio em C #?


9
Então, o que há de errado em usar if (list.Count == 0) { /* ... */ }?
Bart van Nierop 18/09/2013

11
Ouif (!list.Any())
Tharwen 18/09/2013

10
Não consigo entender por que essa pergunta foi votada com baixa votação. Para mim é muito específico (LISTA DE OBJETOS). Não há nada "incerto" aqui. Esta pergunta tem mais de 30 mil visualizações. 1
MarceloBarbosa

2
A questão faz todo sentido. "Preciso exibir uma mensagem de erro se a lista estiver vazia". Lembre-se de que na comunicação humana, nem todo personagem importa.
Todd Painton

9
Este também é o resultado número 1 do Google, C# list isemptypara o qual está totalmente correto. Acho que partes irrelevantes da pergunta devem ser editadas e estou votando para reabrir.
Felix Dombek

Respostas:


142

Por que não...

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

Também GridViewtem um EmptyDataTemplateque é mostrado se a fonte de dados estiver vazia. Esta é uma abordagem no ASP.NET:

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

<emptydatatemplate>

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

    No Data Found!  

</emptydatatemplate> 

2
Nota: a segunda abordagem pressupõe o ASP.NET.
Tim Schmelter

2
Não seria melhor verificar se list == nullprimeiro?
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

2
@ var, someList = nova lista <string> (); seria instanciado (e, portanto, não ser nulo) mas seria vazio de elementos de processo
daviesdoesit

73

Se a implementação da lista que você está usando for IEnumerable<T>e Linq for uma opção, você poderá usar Any:

if (!list.Any()) {

}

Caso contrário, você geralmente tem uma propriedade Lengthou Countem matrizes e tipos de coleção, respectivamente.


10
Nota rápida: list.Any tem um desempenho muito melhor que o count.
Adrian Lopez

2
@AdrianLopez: você pode falar sobre isso? Se você possui uma propriedade .Countou .Lengthcomo o Listque poderia .Any()ser mais rápido do que verificar a propriedade da coleção que controla o tamanho ou a contagem atual? Se você possui apenas um enumerador, .Any()é claro que é mais rápido que .Count() > 0. Consulte também: stackoverflow.com/questions/305092/… ou stackoverflow.com/questions/5741617/…
noox 21/04/19

2
@noox Olhando para a fonte (.Net Core), parece que Anyverifica se a recuperação da contagem é barata antes de testá-la; nos casos em que você tiver uma IListProvider<>que não rastreie a contagem, ela será enumerada uma vez.
NetMage 12/11/19

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

Você pode tornar seu DataGrid visível falso e torná-lo visível na seção else.


@NetMage Não é assim que funciona para a lista. É uma O(1)operação e não há iterações feitas para contar elementos. Veja List<T>.Count.
Spencer Wieczorek

@SpencerWieczorek Você está correto, esse comentário era antigo e errado :) Embora, em geral, eu ainda prefira Any()expressar melhor a intenção, além de ter um desempenho melhor quando você não sabe que tem um currículo real List<T>.
NetMage 12/11/19

18

Que tal usar a Countpropriedade.

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

3
Count é uma propriedade não é um método
muçulmano Ben Dhaou

5
@MoslemBenDhaou Depende se é o método de extensão Linq exposto / sendo chamado ou nativo do objeto.
Grant Thomas

@GrantThomas Levei-o como um objeto List <T>, mas sim, você está correto.
Muçulmano Ben Dhaou

e se listOfObjects for nulo?
Sabri Meviş 27/10/2017

2
@ SabriMeviş uma coleção / ienumerable / list retornada de um método nunca deve ser null. Em vez disso, deve ser uma coleção vazia.
Jeroen van Langen

8

Você deve usar uma IFdeclaração simples

List<String> data = GetData();

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

PopulateGrid();
ShowGrid();

Mais simples e melhor maneira IMO.
Jabba #

Se o método retornar um valor nulo, a propriedade Count falhará. Para manter o código conciso, considere o operador de verificação de referência nula "?". Exemplo "if (data? .Count == 0)....." ou a verificação nula clássica "if (data! = null && someOtherCondition) ....."
daviesdoesit 13/03/19

Cole o seguinte código em um dotnetfiddle e você verá a referência System.NullReferenceException: Object não configurada para uma instância de um 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 13/03/19

6
var dataSource = lst!=null && lst.Any() ? lst : null;
// bind dataSource to gird source

3

O gridview em si possui um método que verifica se a fonte de dados à qual você está vinculando está vazia, permitindo exibir outra coisa.


0

Se você estiver usando um gridview, use o modelo de dados vazio: 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>

Isso é muito específico do ASP.NET.
Grant Thomas

Eu não sou um cara de winforms, mas não é um gridview asp.net específico. É uma visualização de dados em formulários?
David MacCrimmon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.