Изменить значение элемента указанного массива в clousure - PullRequest
0 голосов
/ 16 февраля 2011

Слушай, у меня есть какой-то метод, в котором я пытаюсь проверить, изменилось ли значение, и записать его, если оно изменилось, но мне нужно помнить, какие значения были изменены, и вот проблема, я не могу установить измененныефлаг, потому что я не знаю, как изменить элемент ref, и я не могу использовать изменяемый там.

member X.qArchive() = 
    //let mutable rememberer = [for d in db.AlarmDictionaries -> d.ID, false].ToArray() 

    let rememberer = ref ( [for d in db.AlarmDictionaries -> d.ID, false].ToArray() )

    seq {for a in db.ArchiveDescretes do 
            let i = ref 0
            for r in !rememberer do 
                if a.ID = fst r && snd r = false then
                    rememberer.[(!i)] := fst r, true // Error
                    //rememberer.[(!i)] <- fst r, true // Error
                    for c in db.AlarmDictionaries do
                    if (c.ID = a.ID) then
                        yield a.Date, c.Message, a.Value
                i := !i + 1 } |> Array.ofSeq

также, если вы знаете, как я могу реализовать эту идею каким-то лучшим способом, я тоже буду вам благодарен.

вот мой злой вариант:

    member X.qArchive() = 
    seq {   let metarememberer = ref ( [for d in db.AlarmDictionaries -> d.ID, false].ToArray() )
            let rememberer = ref ( [for d in db.AlarmDictionaries -> d.ID, false].ToArray() )
            for a in db.ArchiveDescretes do 
                let i = ref 0
                for r in !metarememberer do 
                    if a.ID = fst r && snd r = false then
                        (!metarememberer).[!i] <- fst r, true
                        for c in db.AlarmDictionaries do
                            if c.ID = a.ID && c.Value = a.Value then
                                let j = ref 0
                                for rm in !rememberer do 
                                    if a.ID = fst rm then
                                        (!rememberer).[!j] <- fst rm, a.Value
                                    j := !j + 1
                                yield a.Date, c.Message
                    else
                        let j = ref 0
                        for rm in !rememberer do
                            if a.ID = fst rm && a.Value <> snd rm then
                                (!rememberer).[!j] <- fst rm, a.Value
                                for c in db.AlarmDictionaries do
                                    if c.ID = a.ID && c.Value = a.Value then
                                        yield a.Date, c.Message
                            j := !j + 1
                    i := !i + 1 
        } |> Array.ofSeq

Обновление: Ведь мой вариант не работает.Что-то здесь не так ... Я могу видеть одно и то же событие 2 раза, мне нужно видеть его только при изменении значения, что означает, что я не могу видеть одно и то же событие 2 раза.

1 Ответ

1 голос
/ 16 февраля 2011

что насчет этого?

(!rememberer).[!i] <- fst r, true
...