Verify that the item exists in a List

0

I have a list typed in C # and I need to look up an item through multiple filters. Proving codes:

List<LoteRecla> listLoteRecla = new List<LoteRecla>();

I tried to use the .Exists () method by filtering only one field from this list, as below and worked normally.

    if (!listLoteRecla.Exists(x => x.est_lote.Equals(dtDados.Rows[i]["est_lote"].ToString())))

But I was asked to use more filters, I tried to do the following:

if (!listLoteRecla.Exists(
                                x => x.est_lote.Equals(dtDados.Rows[i]["est_lote"].ToString()) &&
                                x.id_log_unidade.Equals(dtDados.Rows[i]["id_log_unidade"]) &&
                                x.id_log_unid_local.Equals(dtDados.Rows[i]["id_log_unid_local"]) &&
                                x.loc_rua.Equals(dtDados.Rows[i]["loc_rua"]) &&
                                x.loc_num.Equals(dtDados.Rows[i]["loc_num"].ToString()) &&
                                x.loc_altura.Equals(dtDados.Rows[i]["loc_altura"].ToString()) &&
                                x.id_log_produto.Equals(dtDados.Rows[i]["id_log_produto"]) &&
                                x.id_log_produto_emb.Equals(dtDados.Rows[i]["id_log_produto_emb"])))
                            {

But this way it is not working, I go through the same data and should not enter the IF, but it is coming in.

Am I doing something wrong? Is there any other way to do this that I need?

Thank you.

    
asked by anonymous 05.02.2015 / 20:09

3 answers

2

The correct way is using Any :

if (!listLoteRecla.Any(
                            x => x.est_lote.Equals(dtDados.Rows[i]["est_lote"].ToString()) &&
                            x.id_log_unidade.Equals(dtDados.Rows[i]["id_log_unidade"]) &&
                            x.id_log_unid_local.Equals(dtDados.Rows[i]["id_log_unid_local"]) &&
                            x.loc_rua.Equals(dtDados.Rows[i]["loc_rua"]) &&
                            x.loc_num.Equals(dtDados.Rows[i]["loc_num"].ToString()) &&
                            x.loc_altura.Equals(dtDados.Rows[i]["loc_altura"].ToString()) &&
                            x.id_log_produto.Equals(dtDados.Rows[i]["id_log_produto"]) &&
                            x.id_log_produto_emb.Equals(dtDados.Rows[i]["id_log_produto_emb"])))
                        {
    
06.02.2015 / 18:48
0

I did that and it worked.

if (!listLoteRecla.Exists(x => x.est_lote.Equals(dtDados.Rows[i]["est_lote"].ToString())) && 
    !listLoteRecla.Exists(x => x.id_log_unidade.Equals(dtDados.Rows[i]["id_log_unidade"])) &&
    !listLoteRecla.Exists(x => x.id_log_unid_local.Equals(dtDados.Rows[i]["id_log_unid_local"])) &&
    !listLoteRecla.Exists(x => x.loc_rua.Equals(dtDados.Rows[i]["loc_rua"])) &&
    !listLoteRecla.Exists(x => x.loc_num.Equals(dtDados.Rows[i]["loc_num"].ToString())) &&
    !listLoteRecla.Exists(x => x.loc_altura.Equals(dtDados.Rows[i]["loc_altura"].ToString())) &&
    !listLoteRecla.Exists(x => x.id_log_produto.Equals(dtDados.Rows[i]["id_log_produto"])) &&
    !listLoteRecla.Exists(x => x.id_log_produto_emb.Equals(dtDados.Rows[i]["id_log_produto_emb"]))){

But now I'm in another situation that I'm going to need some help too.

I want to retrieve the index of the list line by filtering through the same fields above, I tried with the .FindIndex () method and it only works with one parameter, as below.

int index = listLoteRecla.FindIndex(x => x.est_lote.Equals(dtDados.Rows[i]["est_lote"].ToString()));

If I try to add more parameters to it, it does not work.

Is there any other method that does something like this? Or any examples that I can use the same .indind () same?

    
06.02.2015 / 11:54
0

I did using the idea of Predicate < > and it worked and even in Code Metrics the method got cleaner. It looks like this:

Call:

int index = listLoteRecla.FindIndex(LogicaDeBuscaEditar);

Method:

private static bool LogicaDeBuscaEditar(LoteRecla obj)
        {
            if(obj.est_lote.Equals(dtRowGlobal["est_lote"].ToString()) &&
                obj.id_log_produto.Equals(Convert.ToInt64(dtRowGlobal["id_log_produto"])) &&
                obj.id_log_produto_emb.Equals(Convert.ToInt64(dtRowGlobal["id_log_produto_emb"])) &&
                obj.id_log_unid_local.Equals(Convert.ToInt64(dtRowGlobal["id_log_unid_local"])) &&
                obj.id_log_unidade.Equals(Convert.ToInt64(dtRowGlobal["id_log_unidade"])) &&
                obj.loc_altura.Equals(dtRowGlobal["loc_altura"].ToString()) &&
                obj.loc_num.Equals(dtRowGlobal["loc_num"].ToString()) &&
                obj.loc_rua.Equals(dtRowGlobal["loc_rua"].ToString()))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

I thought it was organized this way because the entire validation rule was in another method.

Thank you.

    
06.02.2015 / 14:00