У меня есть два массива в f# 1-й массив называется CompositionArray и содержит массив объектов типа Composition.KeyValue. 2-й массив — это просто целочисленный массив, содержащий некоторые индексы. Пример: [10; 20; 30]
Мне нужно отфильтровать/выбить CompositionArray на основе индексов, найденных во втором массиве. Таким образом, окончательный отфильтрованный массив не будет содержать объекты для 10-го, 20-го и 30-го индексов.
Ниже то, что я пробовал до сих пор, но получаю ошибку компиляции
Результат этого выражения равенства имеет тип bool и неявно отбрасывается. Рассмотрите возможность использования 'let' для привязки результата к имени, например. 'пусть результат = выражение'. Если вы намеревались изменить значение, пометьте значение как «изменяемое» и используйте оператор «<-», например. 'существует <- выражение'.
let finalCompositions = [|
if ArrayIndexes.Length > 0 then //if there are elements in IndexArray then only filter CompositionArray
for i = 0 to CompositionArray.Length-1 do //iterate through the composition array
for y = 0 to IndexeArray.Length-1 do //iterate through the index array
let exists = false
if i <> IndexArray.[y] then //CompositionArray loop counter not equals to IndexArray value
if y.Equals(IndexArray.Length-1) && not exists then //Considering this is end of IndexArray counter
yield CompositionArray.[i]
else
exists = true //Compile error at this line.
else
for i = 0 to CompositionArray.Length-1 do
yield CompositionArray.[i] //Return the entire CompositionArray as is if there are no elements in IndexArray
|]
Я новичок в f# и прошу прощения за такой вопрос новичка
let removeAt index input =
input
|> List.mapi (fun i el -> (i <> index, el))
|> List.filter fst |> List.map snd
let folder (numRemovals, filtered) index =
let i = index - numRemovals
numRemovals + 1, filtered |> removeAt i
let compArray = [ 0..31 ] // Example; can be any type
let indices = [10; 20; 30]
let result =
indices
|> List.fold folder (0, compArray)
|> snd
// result = [0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 11; 12; 13; 14; 15; 16; 17; 18; 19;21; 22; 23;24; 25; 26; 27; 28; 29; 31]
Позвольте мне попробовать... но CompositionArray - это не массив целых чисел, это массив объектов типа Composition.KeyValue.
Он должен работать для любого типа, так как он фильтрует только по индексу. Я просто использовал список int для демонстрации.
Это сработало очень хорошо, я просто заменил ссылки List на Array. Большое тебе спасибо
Функция для создания последовательности ленивый из любого источника. Он выделяет гораздо меньше, чем версия со списками.
let removeAtIndexes (source: 'a seq) (indexes: int seq) : 'a seq =
seq {
let set = HashSet indexes
for (el, idx) in Seq.zip source (Seq.initInfinite id) do
if not <| set.Contains idx then
yield el
}
let compAr = [ 0..31 ]
let indices = [10; 20; 30]
let result = removeAtIndexes compAr indices
printfn "%s" (String.Join(", ", result))
Если вам нужно создать список, используйте result |> List.ofSeq
.
Если метод выделяет слишком много, измените отслеживание индекса на изменяемую переменную.
что ты уже испробовал?