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 :)

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
}

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);

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
}

13

Isso é muito fácil de fazer usando LINQ:

var match = pricePublicList.FirstOrDefault(p => p.Size == 200);
if (match == null)
{
    // Element doesn't exist
}

É 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);

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
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.