LIST COMPARAR COM NULL OU COUNT?

LUIS.HERRERA 25/04/2013 09:36:20
#422475
Bom dia.

Estou com um problema para testar se há dados no List.

Uso o List<Entidade> para carregar dados do banco e
- povoar um DataGridView
- povoar um ComboBox
}[/c]

O problema está em fazer a comparação para saber se retornou dados, mas as vezes dá erro:

Tem lugar que faço assim:

if (minhaLista == null)


e em outros assim:

if (minhaLista.Count == 0)


Por algum motivo que não identifiquei, tem situações que funciona de uma forma ou de outra e as vezes dá erro ex:

Se usar o if (minhaLista == null) mesmo não tendo conteúdo, a instrução a seguir do if não é executada, e se usar o if (minhaLista.Count == 0) as vezes gera erro.

Como ter uma forma segura de saber se há dados no List sem correr risco de erro?
OCELOT 25/04/2013 09:52:35
#422476
Resposta escolhida
Isso dai depende de como você pega esse minhaLista, você deveria fazer de forma que garantisse sempre retornar um List mesmo vazio ou que sempre que não tenha nada retorne null.

Se não tiver controle sobre isso o que pode fazer é por as duas verificações juntas
if (minhaLista == null || minhaLista.Count == 0)

Desta forma nunca ocorreria o erro pelo uso do operador OR de Curto Circuito, desta forma se a lista for nula ela já da como verdadeiro e não tenta verificar o count, se não for nula então ele verifica o count também.
KERPLUNK 25/04/2013 12:12:29
#422485
O melhor mesmo, na minha opinião é nunca trabalhar com objeto instanciado vazio, se não tem nada para mostrar, ele deve ser null. Mas a alternativa acima, usando o operador de short-circuit, é uma boa idéia. Eu, particularmente, uso um método de extensão [Ô]IsNullOrEmpty[Ô], que retorna true quando for null ou vazio.
WEBMASTER 25/04/2013 15:52:01
#422502
Realmente o interessante e entender como voce cria a lista.
LUIS.HERRERA 25/04/2013 16:05:39
#422504
A lista é criada com base na entidade da classe (modelo da tabela do banco):

No formulário chamo assim:

EmpresasBLL obj = new EmpresasBLL();
List<EmpresasModelo> listEmpresas = new List<EmpresasModelo>();
try
{
listEmpresas = obj.MontaGridViewEmpresa(myInativo);

if ((listEmpresas == null) || (listEmpresas.Count == 0))
{
MessageBox.Show(Idioma.RetornaMensagem([Ô]SemRegistrosLocalizados[Ô]), Idioma.RetornaMensagem([Ô]TituloAvisoMSG[Ô]), MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}

grid.DataSource = listEmpresas;

grid.RowsDefaultCellStyle.BackColor = Color.LightCyan;
grid.AlternatingRowsDefaultCellStyle.BackColor = Color.LightBlue;
grid.CellBorderStyle = DataGridViewCellBorderStyle.None;
grid.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
grid.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
grid.AllowUserToResizeColumns = false;
}


Na DAL está assim o método que monta a lista:

public List<EmpresasModelo> MontaGridViewEmpresas(byte myInativo)
{
List<EmpresasModelo> listEmpresas = new List<EmpresasModelo>();


string mySQL = [Ô]SELECT IDEMPRESA, RAZAOSOCIAL, CNPJ, MATRIZ, INATIVO FROM EMPRESAS WHERE INATIVO = @INATIVO ORDER BY RAZAOSOCIAL asc;[Ô];

SqlCommand cmd = new SqlCommand(mySQL, Dados.cn);
cmd.Parameters.Add([Ô]@INATIVO[Ô], SqlDbType.Bit);
cmd.Parameters[[Ô]@INATIVO[Ô]].Value = myInativo;
SqlDataReader dr = null;

try
{
Dados.AbrirConexao();
dr = cmd.ExecuteReader();

while (dr.Read())
{
EmpresasModelo myEmpresa = new EmpresasModelo();
myEmpresa.IDEMPRESA = (Int32)dr[[Ô]IDEMPRESA[Ô]];
myEmpresa.RAZAOSOCIAL = (string)dr[[Ô]RAZAOSOCIAL[Ô]];
myEmpresa.CNPJ = (string)dr[[Ô]CNPJ[Ô]];
myEmpresa.MATRIZ = Convert.ToByte(dr[[Ô]MATRIZ[Ô]]);
myEmpresa.INATIVO = Convert.ToByte(dr[[Ô]INATIVO[Ô]]);
listEmpresas.Add(myEmpresa);
}
}
catch (SqlException)
{
throw;
}
catch (Exception)
{
throw;
}
finally
{
Dados.FecharConexao();
}
return listEmpresas;
}


Então pode trazer ou não dados, se não traz eu tenho de limpar o grid para não exibir os dados anteriores, nesse ponto estou tendo de usar:
Grid.DataSource = null
e depois remontar o grid, pois com uso de List ou DataTable ou outros objetos, não é possível incluir ou excluir itens do grid via código, assim tenho de resetar total e remontar o grid a cada consulta.
Tópico encerrado , respostas não são mais permitidas