2013-04-23 40 views
20

我有一個List<MyClass> MyList其中查找列表<元素>包含的值

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

一個名字,我想獲得相應的價值。我有它目前實施爲:

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

有沒有更乾淨的方式來做到這一點?

+1

可能重複* [如何在列表中找到特定元素?](http://stackoverflow.com/questions/9854917/how-can-i-find-a-specific-element-in- A-listt)*。 – 2016-10-19 16:57:52

回答

68

要麼使用LINQ:

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

(這將只是找到了第一場比賽,當然有很多解決此選項。)

或者使用Find代替FindIndex

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

我強烈建議使用LINQ,雖然 - 這是一個更多的idiomat ic這些天。

(我也建議遵循.NET的命名規則。)

+3

不要忘記在調用'.value'之前檢查空值 – banging 2013-04-23 19:08:58

+2

@banging:我正在嘗試編寫與原始代碼具有相同假設的東西 - 如果未找到該值,原始代碼將會爆炸,所以這也是。 Ty。 – 2013-04-23 19:13:41

+0

Ty。當你說.net命名約定時,你的意思是沒有大寫對象名稱的首字母嗎? (** M ** yList vs myList)還是別的? – RaGe 2013-04-23 19:14:59

11

您可以使用Where進行過濾,並使用Select來獲得所需的值。

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

我剛剛刷新了,Skeet的回答是「4分鐘前」,而Hosseins說「3分鐘前」......現在他們都是4歲。我將它稱爲一條領帶(他們都不知道對方正在回答) – Cemafor 2013-04-23 19:11:33

+0

以及對此答案的所有評論正在消失 – Cemafor 2013-04-23 19:12:22

+0

@Cemafor:我看到侯賽因在回答,但我給出了一個稍微不同的答案 - 因爲它只找到*一個*值。 (這就是所有這些都被視爲一項要求。) – 2013-04-23 19:14:17

3

Enumerable.First返回,而不是指數的元素。在這兩種情況下,如果列表中沒有出現匹配的元素,您將得到一個異常(當您嘗試在索引-1處獲取項目時,您的原始代碼將拋出IndexOutOfBoundsException,但First將拋出InvalidOperationException)。

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

使用函數查找更乾淨的方式。

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

我會用.Equals()進行比較,而不是==

像這樣:

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

特別是因爲它可以讓你喜歡StringComparison,這是真棒選項。例如:

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

這使您的代碼可以忽略特殊字符,大寫和小寫。有更多的選擇。