2016-09-14 8 views
-1

Это следующий вопрос к этому вопросу SO-post.Как преобразовать x для x в seq в seq

Учитывая этот блок кода (csvData1 это файл .csv.)

let mappedSeq1 = seq { for csvRow in csvData1 do yield (csvRow.[2], csvRow.[5]) } 

for x in mappedSeq1 do 
    printfn "%A" x 

Что делать, если я не хочу, чтобы распаковать каждый элемент последовательности в x и второй вал мы могли бы назвать y. Как я могу преобразовать x в последовательность, поэтому я могу использовать Seq.fst и Seq.snd?

Я знаю, что можно распаковать эти элементы. Мой вопрос заключается в том, чтобы найти альтернативный способ сделать это, особенно учитывая, что x является System.Tuple.

+0

* "что такое' x'? "* Вы используете средство разработки с информацией о типе? Например, в Visual Studio вы можете увидеть тип 'x', наведя на него курсор мыши. –

+0

Да, x является System.Tuple, но я не могу структурировать код для использования Seq.fst и т. Д. – octopusgrabbus

+0

Я удалил часть x части OP. В принципе, я хочу вытащить первый или второй элемент из System.Tuple без распаковки. Это более или менее академический запрос. Я просто хочу знать, есть ли другой способ. – octopusgrabbus

ответ

4

x является кортеж из двух string с (что я предполагаю, что csvRow.[i] есть), потому что, как вы yield его из последовательности. И вы можете destructure его прямо в for цикле:

for (x,y) in mappedSeq1 do 
    printfn "%s - %s" x y 

или вы можете использовать fst x или snd x, если вы не хотите destructure х.

+0

Я не хочу разрушать х. Из-за отсутствия лучшего способа описать его, я хотел бы передать x в Seq, поэтому я могу использовать методы Seq. – octopusgrabbus

+0

'fst' /' snd' все равно разрушает кортеж ... – scrwtp

+1

Я не совсем понимаю, как вы хотите «перевести x в Seq». 'x' - это кортеж, а не последовательность, поэтому вы не можете« отбросить »его. Вы имели в виду, что вы хотели создать _create_ последовательность с двумя элементами в ней? Затем вы можете просто создать список '[x; у] '. Вы имели в виду что-то еще? –

0

Ваш код в настоящее время создает последовательность, которая считывает строки и производит наборы столбцов 2 и 5.

Если вы хотите вернуть последовательность Row0Col2; Row0Col5; Row1Col2; Row1Col5 (две колонны должны быть одного и того же типа), а затем использовать

yield! [ csvRow.[2], csvRow.[5] ]

Или, если вы хотите, последовательность последовательностей - [Row0Col2; Row0Col5]; [Row1Col2; Ro1Col5], а затем использовать

yield [ csvRow.[2]; csvRow.[5] ]

yield! даст каждый отдельный элемент из списков, в то время как yield просто дают списки в последовательности.

Смежные вопросы