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.