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

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

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

Kuzgun
fonte
@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();
 }
Jeroen van Langen
fonte
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();
Muçulmano Ben Dhaou
fonte
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
TalentTuner
fonte
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.

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