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

ilija veselica
źródło

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
}
Anthony Pegram
źródło
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);
Daniel A. White
źródło
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
}
Tiago
źródło
13

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

var match = pricePublicList.FirstOrDefault(p => p.Size == 200);
if (match == null)
{
    // Element doesn't exist
}
Jakub
źródło
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);
Mark Byers
źródło
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
źródło