2012-04-23 11 views
0

私はforループでこれを行うことができることを知っています。私は仕事をより効率的に達成することを望んでいました。辞書をフィルタリングしてリストを返す

私は辞書(Of Integer、Boolean) またはOf String、Booleanを持っています。 すべての値が真である辞書(整数のリスト)またはOf String(いつでも必要なものに応じて偽)を取得したい場合

そしてそれを一般化するか「ブラックボックス」するか、それはどんな辞書でも(何のものであれ、何でも) であり、その時点で何を探していても値のリストを返すことができます。

文字列、短いの値= "クローズ"

文字列:

Public Function FindInDict(Of tx, ty)(thedict As Dictionary(Of tx, ty), criteria As ty) As List(Of tx) 
    Dim tmpList As New List(Of tx) 

    For xloop As Integer = 0 To thedict.Count - 1 
     If CType(thedict(thedict.Keys(xloop)), ty).Equals(criteria) Then 
      tmpList.Add(thedict.Keys(xloop)) 
     End If 
    Next 
    Return tmpList 
End Function 
+0

ここでは、Forループが最善の策だと思います。しかし、私は間違っている可能性があります –

+0

また、私はmyList.Find(基準)またはmyList.FindAll(基準)のようにすることができます、辞書の同等ですか? – JeZteR

答えて

2

あなたはLINQので簡単にこれを行うことができます。

Public Function FindInDict(Of tx, ty)(thedict As Dictionary(Of tx, ty), criteria As ty) As List(Of tx) 
    Return (From kvp In thedict 
      Where kvp.Value.Equals(criteria) 
      Select kvp.key).ToList() 
End Function 
1

使用LINQ:私はいくつかの基準

私の現在のコード=値だすべてのキーのすべてのリストが欲しいです、そのよう:

Dim tStorage As Dictionary(Of String, String) = New Dictionary(Of String, String) 
Dim tKeys As List(Of String) = New List(Of String) 
Dim tCriteria As List(Of String) = New List(Of String) 

tStorage.Add("One", "Uno") 
tStorage.Add("Two", "Dos") 
tStorage.Add("Three", "Tres") 
tStorage.Add("Four", "Quatro") 

tCriteria.Add("Dos") 
tCriteria.Add("Quatro") 

tKeys = (From k In tStorage.Keys Where tCriteria.Contains(tStorage(k)) Select k).ToList 

For Each tKey As String In tKeys 
    Console.WriteLine(tKey) 
Next 

Console.ReadKey() 
関連する問題