2009-10-27 88 views
0

鑑於以下vb.net類的列表中返回所有的鍵:如何某一個值,從KeyValuePair(vb.net或C#)

Friend Class PairCollection(Of TKey, TValue) 
    Inherits List(Of KeyValuePair(Of TKey, TValue)) 

    Public Overloads Sub Add(ByVal key As TKey, ByVal value As TValue) 
     Me.Add(New KeyValuePair(Of TKey, TValue)(key, value)) 
    End Sub 

    Public Function FindByValue(ByVal value As TValue) As List(Of KeyValuePair(Of TKey, TValue)) 
     Return Me.FindAll(Function(item As KeyValuePair(Of TKey, TValue)) (item.Value.Equals(value))) 
    End Function 

End Class 

功能FindByValue返回適合的數值單KeyValuePair 。然而,這個PairCollection的實現可能有m:1的值,所以我希望返回所有具有該值的鍵(可能有多個鍵)。

問題不容易,我是vb.net中的Lambda表達式的新手,並且更熟悉C#。我可以寫一個簡單的例程來遍歷集合,但我覺得有一個通用的組合方法。

我想什麼,我試圖做的是沿着以下線的東西:

Public Function FindByValue2(ByVal value As TValue) As List(Of TKey) 
    Return Me.FindAll(Function(item As list(of TKey) (item.Value.Equals(value))) 
End Function 

相關理由的背後是什麼,我試圖爲here

回答

1

你正在做的正確。您只需要使用Select來投影輸出結果。

Public Function FindByValue(ByVal value As TValue) As List(Of TKey) 
    Return Me.Where(Function(item) item.Value.Equals(value)) _ 
      .Select(Function(x) x.Key).ToList() 
End Function 

順便說一句,在繼承List幾乎總是一個錯誤的做法。嘗試重新設計你的班級。

+0

謝謝Mehrdad 100%正確。 – Topdown 2009-10-27 04:00:25