none
Verificar se existe um valor em uma Lista que é de STRUCT e que neste apresenta vários campos dentro. RRS feed

  • Pergunta

  • Bom Dia,

    Hoje eu estava convertendo o código para uma pratica um pouco melhor, pois estava ficando muito complicado ter de criar Lista por Lista separada.

    Eu interliguei em uma única lista vários valores providos de uma struct, mas o problema é como encontra-los usando o Contains ou qualquer algo do gênero futuro.

    Exemplo:

    struct User
    {
     public string ID;
     public string Nick;
     //...
    }
    
    
    public static List<User> Usuario = new List<User>();
    // ... 
    
    
    if(Usuario.Contains(...  /* QUERO VERIFICAR O NICK. */ ))
    {
     // Como eu uso? não há como fazer struct anóminas e se der, nem sei se ao certo é isso.
     // Quero verificar pelo campo NICK.
    }
    
    

    sábado, 10 de junho de 2017 14:00

Respostas

  • Mas você tem que se lembrar que os métodos de extensão do Linq retornam um IEnumerable<T>, Porque os métodos de extensão do Linq pertencem à essa interface.

    Por tanto, o código correto seria:

    IEnumerable<User> retorno = Usuario.Where(Usuario => Usuario.NickName == Sintaxe[0]);

    Ou você pode fazer uma conversão; claro, usando os métodos de extensão do IEnumerable

    List<User> retorno = Usuario.Where(Usuario => Usuario.NickName == Sintaxe[0]).ToList();
    User[] retorno = Usuario.Where(Usuario => Usuario.NickName == Sintaxe[0]).ToArray();

    Mas só por curiosidade, o que exatamente é "Sintaxe" no seu código?

    • Editado Cliffinho segunda-feira, 12 de junho de 2017 13:20
    • Marcado como Resposta KDST quinta-feira, 15 de junho de 2017 03:11
    segunda-feira, 12 de junho de 2017 13:19

Todas as Respostas

  • Você pode usar o Linq e uma Expressão Lambda para pegar todos os User's com certo Nick.

    public IEnumerator<User> GetUsersByNick(string nickToSearch)
    {
        // "users" é sua List<User>
        IEnumerable<User> perNickUsers = users.Where(x => x.Nick == nickToSearch);
        return perNickUsers;
    }

    Você também pode usar delegates genéricos como Func e Predicate para usar o mesmo código acima, porém, com outros tipos de filtros, por exemplo, filtrando o ID ou outra informação.

    domingo, 11 de junho de 2017 15:02
  • Eu acho que encontrei uma forma usando Lambda, mas mesmo assim obrigado, vou usar se der errado.

    Eu estou usando isso:

    User retorno = Usuario.Where(Usuario => Usuario.NickName == Sintaxe[0]);
    

    Se ele não encontrar nada, o que terá na variável retorno? por que pelo que eu vi, struct é tipo valor e não poderia conter null, mas o que ela terá se não encontrar nada?

    domingo, 11 de junho de 2017 22:31
  • Mas você tem que se lembrar que os métodos de extensão do Linq retornam um IEnumerable<T>, Porque os métodos de extensão do Linq pertencem à essa interface.

    Por tanto, o código correto seria:

    IEnumerable<User> retorno = Usuario.Where(Usuario => Usuario.NickName == Sintaxe[0]);

    Ou você pode fazer uma conversão; claro, usando os métodos de extensão do IEnumerable

    List<User> retorno = Usuario.Where(Usuario => Usuario.NickName == Sintaxe[0]).ToList();
    User[] retorno = Usuario.Where(Usuario => Usuario.NickName == Sintaxe[0]).ToArray();

    Mas só por curiosidade, o que exatamente é "Sintaxe" no seu código?

    • Editado Cliffinho segunda-feira, 12 de junho de 2017 13:20
    • Marcado como Resposta KDST quinta-feira, 15 de junho de 2017 03:11
    segunda-feira, 12 de junho de 2017 13:19
  • Mas só por curiosidade, o que exatamente é "Sintaxe" no seu código?

    Não tinha um nome para eu por, coloque este nome com objetivo de pegar o nome.

    Seria Nick-Name verificando a "Sintaxe", que é o nome coletado em um Readline.

    Obrigado pela ajuda.

    quinta-feira, 15 de junho de 2017 03:10