2011-02-16 2 views
0

값이 변경되면 값을 변경하려고했는지 확인하려고 시도했지만 값이 변경되었다는 것을 기억해야하는 몇 가지 방법이 있습니다. 문제는 ref 항목을 치유하는 법을 모르기 때문에 변경된 플래그를 설정할 수 없으며 거기에서 mutable을 사용할 수 없습니다.Clousure에서 참조 된 배열의 항목 값 변경하기

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 

업데이트 : 내 모든 변형이 작동하지 않습니다 후

여기 내 사악한 변종이다. 뭔가 잘못되었습니다 ... 동일한 이벤트가 두 번 볼 수 있습니다. 값이 변경 될 때만 볼 필요가 있으므로 동일한 이벤트가 두 번 표시되지 않습니다.

답변

1

어떨까요?

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

네, 고맙습니다. 작동합니다 – Cynede