Size: a a a

2021 April 04

АЧ

Андрій Чебукін... in F# Chat
gsomix
obj.ReferenceEquals
Но мне нужно чтобы обычная стандартная логика сравнения работала
источник

АЧ

Андрій Чебукін... in F# Chat
В зависимости от того, какой тип разрешится
источник

EV

Eugene Vinakov in F# Chat
Kir
Нужен рутовый айтем. Ищещь всех, кто на него ссылается (список можно для этого сунуть в мапу (PId, Id) Map, далее рекурсия
спасибо
источник

ДБ

Дмитрий Башинский... in F# Chat
let transform xs =
       xs
       |> Seq.groupBy ^ fun x -> x.ParentId
       |> Seq.map ^ fun (id, items) ->
           let children = items
                          |> Seq.map ^ fun x -> { Id = x.Id; Children = [] }
                          |> Seq.toList
           
           { Id = id; Children = children }
источник

ДБ

Дмитрий Башинский... in F# Chat
я думал что то такого)
источник

g

gsomix in F# Chat
Андрій Чебукін
Но мне нужно чтобы обычная стандартная логика сравнения работала
Ок, давай заново. В чем проблема?
источник

АЧ

Андрій Чебукін... in F# Chat

let updateObservableCollection
     (create: 's -> 'id -> 't)
     update
     (target: ObservableCollection<'t>, getTargetId: 't -> 'id)
     (source: 's array, getSourceId: 's -> 'id) =

 let kvp (k, v) = KeyValuePair<_,_>(k, v)

 let targetIds = target |> Seq.map getTargetId |> Seq.toFlatList
 let sourceIds = source |> Seq.map getSourceId |> Seq.toFlatList

 let targetIdsSet = targetIds |> HashSet.ofSeq
 let sourceIdsSet = sourceIds |> HashSet.ofSeq

 let targetIdsMap = targetIds |> Seq.mapi (fun i id -> kvp(id, i)) |> Seq.toHashMap

 let removes =
   targetIdsSet.Except sourceIdsSet
   |> Seq.map (fun id -> targetIdsMap.[id])
   |> Seq.sortDescending
   |> Seq.toFlatList

 removes |> Seq.iter target.RemoveAt

 let sourceIdsMap = sourceIds |> Seq.mapi (fun i id -> kvp(id, i)) |> Seq.toHashMap
 let adds =
   sourceIdsSet.Except targetIdsSet
   |> Seq.map (fun id -> id, sourceIdsMap.[id])
   |> Seq.sortBy (fun (_, idx) -> idx)
   |> Seq.toFlatList

 adds |> Seq.iter (fun (id, index) -> target.Insert(index, create (source.[index]) id))

 sourceIds
 |> Seq.iter (fun id ->
   let newIdx = sourceIdsMap.[id]
   let oldIdx = target |> Seq.mapi (fun i t -> i, getTargetId t) |> Seq.where (fun (_, tId) -> id = tId) |> Seq.map fst |> Seq.head
   target.Move(oldIdx, newIdx)
   update newIdx
 )
источник

АЧ

Андрій Чебукін... in F# Chat
let oldIdx = target |> Seq.mapi (fun i t -> i, getTargetId t) |> Seq.where (fun (_, tId) -> id = tId) |> Seq.map fst |> Seq.head
источник

АЧ

Андрій Чебукін... in F# Chat
id = tId
источник

g

gsomix in F# Chat
Бля.
источник

АЧ

Андрій Чебукін... in F# Chat
Вот это сравнение накладывает мне на 'id ограничение, что он IEquatable
источник

АЧ

Андрій Чебукін... in F# Chat
А мне не нужно, чтобы возникало это ограничение. Я хочу чтобы обычный Equals отрабатывал в зависимости от попавшего туда типа
источник

g

gsomix in F# Chat
Андрій Чебукін

let updateObservableCollection
     (create: 's -> 'id -> 't)
     update
     (target: ObservableCollection<'t>, getTargetId: 't -> 'id)
     (source: 's array, getSourceId: 's -> 'id) =

 let kvp (k, v) = KeyValuePair<_,_>(k, v)

 let targetIds = target |> Seq.map getTargetId |> Seq.toFlatList
 let sourceIds = source |> Seq.map getSourceId |> Seq.toFlatList

 let targetIdsSet = targetIds |> HashSet.ofSeq
 let sourceIdsSet = sourceIds |> HashSet.ofSeq

 let targetIdsMap = targetIds |> Seq.mapi (fun i id -> kvp(id, i)) |> Seq.toHashMap

 let removes =
   targetIdsSet.Except sourceIdsSet
   |> Seq.map (fun id -> targetIdsMap.[id])
   |> Seq.sortDescending
   |> Seq.toFlatList

 removes |> Seq.iter target.RemoveAt

 let sourceIdsMap = sourceIds |> Seq.mapi (fun i id -> kvp(id, i)) |> Seq.toHashMap
 let adds =
   sourceIdsSet.Except targetIdsSet
   |> Seq.map (fun id -> id, sourceIdsMap.[id])
   |> Seq.sortBy (fun (_, idx) -> idx)
   |> Seq.toFlatList

 adds |> Seq.iter (fun (id, index) -> target.Insert(index, create (source.[index]) id))

 sourceIds
 |> Seq.iter (fun id ->
   let newIdx = sourceIdsMap.[id]
   let oldIdx = target |> Seq.mapi (fun i t -> i, getTargetId t) |> Seq.where (fun (_, tId) -> id = tId) |> Seq.map fst |> Seq.head
   target.Move(oldIdx, newIdx)
   update newIdx
 )
Откуда этот код?
источник

АЧ

Андрій Чебукін... in F# Chat
Я написал
источник

АЧ

Андрій Чебукін... in F# Chat
источник

АЧ

Андрій Чебукін... in F# Chat
Хочу вот это переписать, чтобы оно правильно отрабатывало
источник

АЧ

Андрій Чебукін... in F# Chat
О! Вроде получилось (box id).Equals(box tId) 🤣🤣🤣
источник

АЧ

Андрій Чебукін... in F# Chat
Трэш
источник

g

gsomix in F# Chat
Андрій Чебукін
Вот это сравнение накладывает мне на 'id ограничение, что он IEquatable
Я не пойму, откуда ты это взял.
источник

АЧ

Андрій Чебукін... in F# Chat
Ага, это у меня в другом месте ошибка была. requires equality не мешает
источник