jak sprawdzić, czy element List <T> zawiera element o określonej wartości właściwości


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

Jak sprawdzić, czy element pricePublicListzawiera określoną wartość. Mówiąc dokładniej, chcę sprawdzić, czy istnieje pricePublicModel.Size == 200? Ponadto, jeśli ten element istnieje, skąd wiedzieć, który to jest?

EDYTUJ Jeśli słownik jest do tego bardziej odpowiedni, mógłbym użyć słownika, ale musiałbym wiedzieć, jak :)

Odpowiedzi:


186

Jeśli masz listę i chcesz wiedzieć, gdzie na liście znajduje się element spełniający podane kryteria, możesz użyć FindIndexmetody instancji. Jak na przykład

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

Gdzie f => f.Bar == 17jest predykat z dopasowanymi kryteriami.

W twoim przypadku możesz napisać

int index = pricePublicList.FindIndex(item => item.Size == 200);
if (index >= 0) 
{
    // element exists, do what you need
}

1
co jeśli nie znam atrybutu tej wartości? np. mam element listy, który wyświetla „18,00”. Nie wiem, skąd pochodzi, więc chcę sprawdzić, który atrybut ma tę wartość? więc w zasadzie i podobnie do tego przykładu nie mam .size ani .bar, chcę to
— rozgryźć

co, jeśli element nie istnieje: jaka będzie wartość indeksu?
— BKSpurgeon

8
UWAGA: Jeśli element nie istnieje, findIndexzwróci –1. Dokumentacja: msdn.microsoft.com/es-es/library/x1xzf2ca(v=vs.110).aspx
— tomloprod

1
@tomloprod, dlatego sprawdza indeks większy lub równy zero. if (indeks> = 0). Mógłby również napisać to tak, jakby (indeks> -1).
— DannyC

127
bool contains = pricePublicList.Any(p => p.Size == 200);

6
Ma to na celu wyłącznie sprawdzenie, czy taki istnieje.
— Daniel A. White

3
To naprawdę nie odpowiada na pytanie. Powiedział:how to know which one is it
— George Johnston,

15
Mógłbym nie odpowiedzieć na jego pytanie, ale z pewnością pomogło mi, bo potrzebowałem sprawdzić, czy przedmiot o podanej nazwie już istnieje w mojej kolekcji. Spodziewałem się ulepszonej metody .Contains - i to jest dokładnie to, co robi to wyrażenie LINQ. Dziękuję Ci.
— Igor

3
Odpowiada na pytanie w tytule . OP wyjaśnia w swoim opisie , że tak naprawdę nie chce dokładnie tego, o czym powiedział, że chce. Mimo to jest jeden z nich i dziesiątki z nas, które znajdują to pytanie przez Google. Myślę, że ważniejsze jest, abyśmy byli w stanie znaleźć prawdziwą odpowiedź na jego tytułowe pytanie.
— MGOwen

5
Jeśli ktoś spróbuje tego i .Any () nie zostanie rozpoznany, musisz dodać za pomocą System.Linq; u góry pliku.
— MGOwen

32

Możesz użyć istniejącego

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

13

Za pomocą LINQ jest to całkiem łatwe:

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

Czy można bezpośrednio edytować element spełniający ten warunek? Nie po to, aby go pobrać i zapisać w nowym obiekcie, ale zmienić bezpośrednio?
— ilija veselica

Zwracaną matchwartość można modyfikować (jest to PricePublicModelobiekt znajdujący się na liście).
— Jacob

Nie należy bezpośrednio modyfikować obiektu, który może mieć wartość null. Zawsze możesz to zrobić: match.Size = 300;lub foreach(var item in pricePublicList.Where(p => p.Size == 200)) item.Size = 300;. Sam nie użyłbym tego jako jednolinijki.
— Amy West

11

W rzeczywistości nie potrzebują LINQ do tego, ponieważ List<T>dostarcza sposobu, który robi dokładnie to, co chcesz: Find.

Wyszukuje element, który spełnia warunki zdefiniowane przez określony predykat i zwraca pierwsze wystąpienie w całości List<T>.

Przykładowy kod:

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
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.