views:

56

answers:

1

Given the following vb.net class:

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

The function FindByValue returns a single KeyValuePair that fits a value. However, an implementation of this PairCollection might have m:1 key to value, so I wish to return all keys (and key's only) that have that value (there could be more than one).

Problem isn't made easier that I'm new to Lambda expressions in vb.net, and more familiar with C#. I could write a simple routine to iterate over the collection, but I feel there is a lambda & generic combined approach.

I think what I am trying to do is something along the lines of the following:

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

Related reasoning behind what I am attempting is here.

+1  A: 

You are doing it correctly. You just need to project the output with 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

By the way, inheriting List is almost always a wrong thing to do. Try redesigning your class.

Mehrdad Afshari
Thanks Mehrdad 100% correct.
Topdown