como verificar se o elemento List <T> contém um item com um valor de propriedade particular

113
public class PricePublicModel
{
    public PricePublicModel() { }

    public int PriceGroupID { get; set; }
    public double Size { get; set; }
    public double Size2 { get; set; }
    public int[] PrintType { get; set; }
    public double[] Price { get; set; }
}

List<PricePublicModel> pricePublicList = new List<PricePublicModel>();

Como verificar se o elemento de pricePublicListcontém determinado valor. Para ser mais preciso, quero verificar se existe pricePublicModel.Size == 200? Além disso, se este elemento existe, como saber qual é?

EDITAR Se o Dicionário for mais adequado para isso, então eu poderia usar o Dicionário, mas preciso saber como :)

ilija veselica
fonte

Respostas:

186

Se você tiver uma lista e quiser saber onde dentro da lista existe um elemento que corresponda a um determinado critério, você pode usar o FindIndexmétodo de instância. Tal como

int index = list.FindIndex(f => f.Bar == 17);

Onde f => f.Bar == 17é um predicado com os critérios de correspondência.

No seu caso, você pode escrever

int index = pricePublicList.FindIndex(item => item.Size == 200);
if (index >= 0) 
{
    // element exists, do what you need
}
Anthony Pegram
fonte
1
e se eu não souber o atributo desse valor? Por exemplo, eu tenho um item de lista que está exibindo "18,00" Não sei de onde vem, então quero verificar qual atributo tem esse valor? Então, basicamente, e similarmente a este exemplo, eu não tenho o .size ou .bar que eu quero descobrir
Haithem KAROUI
e se o item não existir: qual será o valor do índice?
BKSpurgeon
8
NOTA: Se o elemento não existir, findIndexretornará –1. Documentação: msdn.microsoft.com/es-es/library/x1xzf2ca(v=vs.110).aspx
tomloprod
1
@tomloprod é por isso que ele verifica um índice maior ou igual a zero. se (índice> = 0). Também poderia ter escrito como se (índice> -1).
DannyC
127
bool contains = pricePublicList.Any(p => p.Size == 200);
Daniel A. White
fonte
6
Isso é estritamente para ver se existe um.
Daniel A. White
3
Isso realmente não responde à pergunta. Ele disse:how to know which one is it
George Johnston
15
Pode não responder a sua pergunta, mas com certeza me ajudou, porque eu precisava ver se um objeto com um determinado nome já existe em minha coleção. Eu esperava um método .Contains melhorado - e é exatamente isso que esta expressão LINQ faz. Obrigado.
Igor
3
Ele responde à pergunta do título . OP explica em sua descrição que ele realmente não quer exatamente o que disse que quer. Ainda assim, há um dele, e dezenas de nós descobrindo essa pergunta por meio do google. Acho que é mais importante podermos encontrar a verdadeira resposta à sua pergunta sobre o título.
MGOwen
5
Se alguém tentar isso e. Qualquer () não for reconhecido, você precisará adicionar usando System.Linq; na parte superior do seu arquivo.
MGOwen
32

Você pode usar o existe

if (pricePublicList.Exists(x => x.Size == 200))
{
   //code
}
Tiago
fonte
13

Isso é muito fácil de fazer usando LINQ:

var match = pricePublicList.FirstOrDefault(p => p.Size == 200);
if (match == null)
{
    // Element doesn't exist
}
Jacob
fonte
É possível editar diretamente o elemento que corresponde a esta condição? Não para pegá-lo e armazenar em um novo objeto, mas mudar diretamente?
ilija veselica
O matchvalor retornado pode ser modificado (é o PricePublicModelobjeto que estava na lista).
Jacob
Você não deve modificar diretamente um objeto que pode ser nulo. Você sempre pode fazer: match.Size = 300;ou foreach(var item in pricePublicList.Where(p => p.Size == 200)) item.Size = 300;. Não o usaria como uma frase de efeito para mim, no entanto.
Amy West
11

Você realmente não precisa LINQ para isso, porque List<T>fornece um método que faz exatamente o que você quer: Find.

Pesquisa um elemento que corresponda às condições definidas pelo predicado especificado e retorna a primeira ocorrência em todo o List<T>.

Código de exemplo:

PricePublicModel result = pricePublicList.Find(x => x.Size == 200);
Mark Byers
fonte
4
var item = pricePublicList.FirstOrDefault(x => x.Size == 200);
if (item != null) {
   // There exists one with size 200 and is stored in item now
}
else {
  // There is no PricePublicModel with size 200
}
Mahesh Velaga
fonte