двумерный массив - значение [| [||] |] - PullRequest
1 голос
/ 07 декабря 2011

Определены две функции:

let to2DStrArray (inObj : string[][]) = 
    Array2D.init   inObj.Length inObj.[0].Length (fun i j -> inObj.[i].[j])                            

let toTypedList typeFunc (strArray : string[,]) =
    if (Array2D.length1 strArray) = 0 then 
        []
    else
        List.init (Array2D.length1 strArray) typeFunc

попытка вызвать их из fsx следующим образом завершится неудачно:

    let testData = to2DStrArray [|[||]|] 
    let failingCall =   testData
                        |> toTypedList (fun row -> (Double.Parse(testData.[row,0]),
                                    Double.Parse(testData.[row,1])))

Какой рабочий / лучший способ заставить этот код обрабатыватьслучай пустых 2-мерных строковых массивов?

Ответы [ 2 ]

3 голосов
/ 07 декабря 2011

Проблема не в функции toTypeList, поэтому вам не нужно проверять, пусто ли strArray или нет.Он выдаст ошибку, если вы проверите inObj.[0].Length в функции to2DStrArray, когда входной массив пуст.Безопасный способ создания Array2D из массива массива - использование оператора array2D :

let to2DStrArray (inObj : string[][]) =
    array2D inObj

Конечно, вы должны гарантировать, что все внутренние массивы имеют одинаковую длину.А другая функция сокращается следующим образом:

let toTypedList typeFunc (strArray : string[,]) =
    List.init (Array2D.length1 strArray) typeFunc

Учитывая ваш вариант использования, обратите внимание, что [| [||] |] не является пустой строкой [] [];это массив, который состоит только из одного элемента, который, в свою очередь, является пустым строковым массивом .Следовательно, это вызывает проблему для анонимной функции, которую вы передали toTypedList.Поскольку двумерный массив имеет length2 <= 1, и вы получаете доступ к двум первым индексам, это приводит к индексу связанного исключения.Функцию можно исправить, возвращая значения параметров, и вы можете извлечь значения из значений параметров для последующего использования:

let testData = to2DStrArray [|[||]|] 
let failingCall = testData                    
                  |> toTypedList (fun row -> if Array2D.length2 testData >= 2 then Some (Double.Parse(testData.[row,0]), Double.Parse(testData.[row,1])) else None)
0 голосов
/ 07 декабря 2011

Реально у вас будет другая проблема как testdata.[0].Length <> testdata.[1].Length - если вы не знаете это откуда-то еще.Я подозреваю, что лучший подход

let ysize = (inobj |> Array.maxBy (fun t -> t.Length)).Length

Я быстро проверил это, и это, кажется, работает - хотя он все еще может потерпеть неудачу в точке доступа к массиву

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...