2013-04-23 17 views
20

mam List<MyClass> MyList gdzieZnajdź element listy <>, który zawiera wartość

public class MyClass 
{ 
    public string name { get; set; } 
    public string value { get; set; } 
} 

Biorąc pod uwagę nazwę, chciałbym, aby uzyskać odpowiednią wartość. Mam to obecnie realizowane jako:

MyList[MyList.FindIndex(item => String.Compare(item.name, "foo", 0) == 0)].value 

Czy jest to czystszy sposób to zrobić?

+1

Możliwy duplikat * [Jak znaleźć konkretny element na liście ?] (Http://stackoverflow.com/questions/9854917/how-can-i-find-a-specific-element-in- a-listt) *. –

Odpowiedz

68

Albo używać LINQ:

var value = MyList.First(item => item.name == "foo").value; 

(To będzie po prostu znaleźć pierwszy mecz, oczywiście Istnieje wiele opcji wokół tego.).

Albo użyć Find zamiast FindIndex:

var value = MyList.Find(item => item.name == "foo").value; 

Zdecydowanie polecam używanie LINQ - to o wiele więcej idiomatu w dzisiejszych czasach.

(Chciałbym również zasugerować następujące konwencje nazewnictwa .NET).

+3

Nie zapomnij sprawdzić wartości zerowych przed wywołaniem '.value' – banging

+2

@banging: Próbowałem napisać coś, co miało te same założenia co oryginalny kod - oryginalny kod zadziałałby, gdyby nie znaleziono wartości, więc to też robi. –

+0

Ty. Kiedy mówisz o konwencji nazewnictwa .net, czy nie masz na myśli liter początkowych nazw obiektów? (** M ** yList vs myList) czy coś innego? – RaGe

11

Można użyć filtru Where, a następnie Select, aby uzyskać żądaną wartość.

MyList.Where(i=>i.name == yourName).Select(j=>j.value); 
+0

Po prostu odświeżyłem, a odpowiedź Skeeta powiedziała "4 min temu", podczas gdy Hosseins powiedział "3 min temu" ... a teraz oboje są w wieku 4 lat. Nazwę to krawatem (oboje nie wiedzieli, że drugi odpowiada) – Cemafor

+0

i wszystkie komentarze dotyczące tej odpowiedzi znikają. – Cemafor

+0

@ Cemafor: Widziałem, że Hossein odpowiadał, ale dałem nieco inną odpowiedź - ponieważ znajduje tylko * jedną * wartość. (To wszystko zostało wskazane jako wymaganie.) –

3

Enumerable.First zwraca element zamiast indeksu. W obu przypadkach otrzymasz wyjątek, jeśli na liście nie pojawi się pasujący element (oryginalny kod wygeneruje wartość IndexOutOfBoundsException, gdy spróbujesz uzyskać element o indeksie -1, ale First spowoduje wyświetlenie InvalidOperationException).

MyList.First(item => string.Equals("foo", item.name)).value 
4

Korzystanie z funkcji Znajdź jest czystszy sposób.

MyClass item = MyList.Find(item => item.name == "foo"); 
if (item != null) // check item isn't null 
{ 
.... 
} 
2

użyłbym .Equals() dla porównania zamiast ==.

tak:

MyClass item = MyList.Find(item => item.name.Equals("foo")); 

Szczególnie ponieważ daje opcje jak StringComparison, co jest niesamowite. Przykład:

MyClass item = MyList.Find(item => item.name.Equals("foo", StringComparison.InvariantCultureIgnoreCase); 

Umożliwia to ignorowanie znaków specjalnych małych i wielkich liter. Jest więcej opcji.

Powiązane problemy