2011-04-12 82 views
0

在下面的代碼片段中,我試圖提取包含在形成代詞鍵的嵌套元組中的recid。 嵌套元組格式(的Int32,(布爾,布爾)) -演員/轉換問題

我要尋找的項目的Int32的值(這是 實際上是一個數據庫記錄行ID)。

在下面的匹配代碼中,我試圖將recid添加到列表中,但首先我將對象轉換爲整數。
但是,這會產生以下錯誤 - 不知道爲什麼?

錯誤: 從類型此運行時脅迫或類型的測試「一個爲int32
涉及基於之前該程序點信息的不確定的類型。 某些類型不允許運行時類型測試。需要進一步的類型註釋。 這裏被引用的字典定義爲:

// Create Dict 
let rdict = new Dictionary<_,_>() 
// Add elements 
rdict.Add((x.["PatientID"],(true,true)),ldiff) 

// Extract Dict items 
let reclist = new ResizeArray<int32>() 
for KeyValue(k,v) in rdict do 
match k with 
    | ((recid,(true,true)) -> 
    printfn "Found a matching Record: %A " recid; // <- prints correct result 
    let n = (recid:?> int32)       // <- coercion error 
     reclist.Add(n) 
+0

線'rdict.Add((X [ 「PatientID」],(真,真))'具有開閉括號的錯配數。哪些'Dictionary'的鍵和值類型?是'int *(bool * bool)'只能用作鍵類型,還是'int'鍵類型和'bool * bool'的值類型?另外,x的實際類型是什麼? 「PatientID」]'?是否返回一個'int'或一個盒裝的'int'(即'obj'可以被轉換爲'int')? – ildjarn 2011-04-12 23:18:28

+0

糟糕 - 我在發佈rdict.add行時瘋狂 - 現在更正了(我實際上是/構建了一個行/列對作爲字典值的列表,dict鍵實際上是一個組合(rid,(boolean,boolean))值(布爾值定義rec是否存在於一對錶格)x。[「PatientID」]是一個從數據庫表中檢索到的(未裝箱的)int值。 – BrendanC 2011-04-12 23:29:27

+0

實際上,一個m礦問題 - 如果你的伴隨「布爾」對是「真實的」,而不是任何其他組合,你是否打算只將ID從'rdict'複製到'reclist'? – ildjarn 2011-04-12 23:36:07

回答

1

假設rdictDictionary<int*(bool*bool), _>然後產生ResizeArray<int>我建議:

let reclist = 
    (ResizeArray<_>(), rdict.Keys) 
    ||> Seq.fold(fun list (id,_) -> list.Add id; list) 

此外,Dictionary<int*(bool*bool), _>令我奇怪的。爲什麼不是Dictionary<int*bool*bool, _>?也就是說,爲什麼要把這對bool作爲第二個元組?如果你把這個變化,一會又打電話rdict.Add像這樣:

rdict.Add ((x.["PatientID"], true, true), ldiff) 

而且reclist將改爲:

let reclist = 
    (ResizeArray<_>(), rdict.Keys) 
    ||> Seq.fold(fun list (id,_,_) -> list.Add id; list) 

編輯:在你的評論中提到打造的願望根據Dictionary密鑰中兩個bool s的不同組合,分開ResizeArray s。這裏有一個想法是這樣做的:

let reclistOnlyA, reclistOnlyB, reclistBoth, reclistNeither = 
    ((ResizeArray<_>(), ResizeArray<_>(), ResizeArray<_>(), ResizeArray<_>()), rdict.Keys) 
    ||> Seq.fold(fun (a, b, both, neither as lists) (id, bools) -> 
     (match bools with 
     | true, false -> a 
     | false, true -> b 
     | true, true -> both 
     | false, false -> neither).Add id 
     lists) 
+0

字典密鑰從初始版本發展而來,只有recid值。從邏輯上講,我查看布爾值與recid有些不同,所以我想我把它們放在一個單獨的嵌套元組中。我可以看到你的方法有一些優勢 - thx爲你的幫助到目前爲止。 – BrendanC 2011-04-12 23:50:05

+0

@BrendanC:效率(減少分配計數)是'int * bool * bool'超過'int *(bool * bool)'唯一的真正優勢。從風格上來說,你給我的感覺很奇怪,但如果它對你有意義,我不會看到任何重大的傷害。 : - ] – ildjarn 2011-04-12 23:52:26

0

爲了完整性和未來的參考,我只是想根據進一步的測試發佈我的結果。 通過裝箱/拆箱,我能夠成功修改我以前發佈的代碼。

希望這將有一些用於未來的其他人。

// Add initial value note the box call here 
diff_dict.Add((box x.["PatientID"],(true,true)),ldiff) 


let reclist = new ResizeArray<int32>() 
for KeyValue(k,v) in rdict do 
    //printfn "Difference Dictionary - Key: %A; Value: %A; " k v 
    match k with 
     // extract the result - note the 'unbox' call 
     | (recid,(true,false)) -> let n:int32 = unbox recid 
            reclist.Add(n)