Проблема приведения / преобразования - PullRequest
0 голосов
/ 13 апреля 2011

В следующем фрагменте я пытаюсь извлечь recid, содержащийся во вложенном кортеже, который образует ключ dict. Формат вложенного кортежа (Int32, (логический, логический)) -

Я ищу значение элемента Int32 (который фактически идентификатор строки для записи в БД).

В приведенном ниже коде соответствия я пытаюсь добавить 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)

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

Если предположить, что rdict - это Dictionary<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)

РЕДАКТИРОВАТЬ В своем комментарии вы упомянули о желании создать отдельные ResizeArray s на основе различных комбинаций двух bool s в клавише Dictionary.Вот одна мысль об этом:

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 голосов
/ 14 апреля 2011

Для полноты и будущего использования я просто хотел опубликовать свои результаты на основе дальнейшего тестирования. Благодаря боксу / распаковке я смог успешно изменить ранее опубликованный код.

Надеюсь, что в будущем это кому-нибудь пригодится.

    // 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) 
...