2011-12-12 69 views
0
let dTuples = new Dictionary<int, string * string * int>() 
dTuples.Add(1, ("A", "OK", 1)) 
dTuples.Add(2, ("B", "NOK", 2)) 
dTuples.Add(3, ("C", "OK", 3)) 

我想從字典中找到它們在值部分的第二個元素中具有「確定」的項目。 我也想將結果轉換爲一個無字典關鍵部分的元組數組。 對於上面的例子,我需要這樣的:F#查找具有一定條件的字典條目

let tuplesOK = [| ("A", "OK", 1); ("C", "OK", 3) |] 

如果您提供的代碼,請還加一些解釋,這樣我就可以更好地理解它! 謝謝, 約翰

回答

3

由丹尼爾的解決方案清楚地回答你的問題,但如果你需要執行基於除了關鍵別的東西在字典中查找,那麼你可能要考慮使用不同的數據結構,因爲在任何點使用字典。也許你可以只使用一個列表:

let data = 
    [ ("A", "OK", 1) 
    ("B", "NOK", 2) 
    ("C", "OK", 3) ] 

然後就像在丹尼爾的解決方案進行使用Seq.filter查找:

data |> Seq.filter (fun (_, ok, _) -> ok = "OK") 
    |> Seq.toArray 

或者,如果你需要你要經常進行查找,

// build a dictionary with second element of the tuple as a key 
let lookupOk = data |> Seq.groupBy (fun (_, ok, _) -> ok) |> dict 

// get a sequence of 'OK' values 
lookupOk.["OK"] 
+0

您好,托馬斯Petricek: 您的代碼工作,但是,在我的問題,我只能使用字典,因爲可變性問題。 –

+0

@JohnJohn什麼樣的「可變性問題」?不應該有專門使用'Dictionary'的理由。即使你需要修改數據謝靈運,您可以將對象添加到普通可變.NET'名單',它的別名是'ResizeArray '在F#。 –

+0

嗨,實際上,我必須從互聯網下載的XML文件中提取一些字符串。但是,在我的程序運行之前,XML字符串的數量是未知的,因此,我必須將所有下載的XML字符串添加到字典中,並從提取的字符串數組中搜索「OK」。 –

5

要檢查第二元組項目匹配 「OK」:

dTuples |> Seq.filter (fun (KeyValue(_, (_,ok,_))) -> ok = "OK") |> Seq.toArray 

要獲得元組的數組(無鑰匙):

dTuples.Values |> Seq.toArray 

如果你不」 t需要可變性,您可以使用dict[MSDN]運算符更簡潔地構建字典。

let dTuples = 
    dict [ 
    1, ("A", "OK", 1) 
    2, ("B", "NOK", 2) 
    3, ("C", "OK", 3) 
    ] 

我不會把它變成教程。代碼非常明瞭,可以通過快速搜索MSDN來填補任何空白。

+0

嗨,丹尼爾: 您的代碼,你可以使用組的第二個元素(OK/NOK標誌),然後將值使用dict功能存儲在字典適用於第一部分:獲取元組的合格數組,但我不知道如何在沒有密鑰的情況下僅獲取值部分。從我的開發工具:VS 2010 Ultimate中,沒有可用的dTuples.Values。 讓我知道你如何獲得字典條目的價值部分。 謝謝, 約翰 –

+0

@約翰約翰:[在線演示](http://www.ideone.com/TO4ww) – Daniel