Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# F序列-如何返回多行_F#_Sequence - Fatal编程技术网

F# F序列-如何返回多行

F# F序列-如何返回多行,f#,sequence,F#,Sequence,这是我的序列,但问题是它返回元组列表,我不能像这样访问单个元组元素 let x = [for p in db.ParamsActXes do if p.NumGroupPar = grp then yield p.Num, p.Name] 这就是问题所在 如何实现此功能?要访问二元组的第二个元素,可以使用snd或

这是我的序列,但问题是它返回元组列表,我不能像这样访问单个元组元素

let x = [for p in db.ParamsActXes do
                                            if p.NumGroupPar = grp then
                                                yield p.Num, p.Name]
这就是问题所在


如何实现此功能?

要访问二元组的第二个元素,可以使用snd或模式匹配。因此,如果tup是一个2元组,其中tup的第二个元素是一个字符串,则可以执行以下操作之一:

let str = "hello" + x.[1]


请注意,snd仅适用于2元组,而不适用于包含两个以上元素的元组。

要访问2元组的第二个元素,可以使用snd或模式匹配。因此,如果tup是一个2元组,其中tup的第二个元素是一个字符串,则可以执行以下操作之一:

let str = "hello" + x.[1]


请注意,snd仅适用于2元组,而不适用于包含两个以上元素的元组。

您可以使用list.nth从元组列表中访问单个元组

let (a,b) = tup
let st = "hello" + b

第一个和第二个表示元组的单个元素。

您可以使用list.nth从元组列表访问单个元组

let (a,b) = tup
let st = "hello" + b

第一个和第二个表示元组的单个元素。

要提供另一种解决方案,您只需通过编写以下内容创建一个包含原始类型值的过滤序列:

然后只需访问所需的属性:

let x = [ for p in db.ParamsActXes do
            if p.NumGroupPar = grp then
              yield p ]
如果只返回p值的几个属性,这可能是个好主意。生成元组的唯一原因是对代码的其余部分隐藏某些内容,或者创建与稍后使用的函数匹配的序列


另外,我会避免使用x[I]索引到列表中,因为这是低效的——但也许这只是为了在您发布的示例中进行说明。如果需要通过将序列表达式包装到[|…|]]中进行基于索引的访问,请使用数组。

要提供另一种解决方案,您只需通过写入以下内容来创建包含原始类型值的筛选序列:

然后只需访问所需的属性:

let x = [ for p in db.ParamsActXes do
            if p.NumGroupPar = grp then
              yield p ]
如果只返回p值的几个属性,这可能是个好主意。生成元组的唯一原因是对代码的其余部分隐藏某些内容,或者创建与稍后使用的函数匹配的序列


另外,我会避免使用x[I]索引到列表中,因为这是低效的——但也许这只是为了在您发布的示例中进行说明。如果您需要基于索引的访问,请使用数组,方法是将序列表达式包装到[|…|]

中,仅抛出一种可能性,如果正在运行F 2.0的.NET 4.0版本,则可以执行从F元组到.NET 4.0 System.tuple的运行时强制转换,然后使用.NET 4.0元组的ItemX属性访问所需的元组元素

let str = "hello" + x.[1].Name

还有一种可能性,如果您正在运行F 2.0的.NET 4.0版本,您可以执行从F元组到.NET 4.0 System.tuple的运行时强制转换,然后使用.NET 4.0元组的ItemX属性访问所需的元组元素

let str = "hello" + x.[1].Name

首先是fst。谢谢,这是我当前问题的解决方案,但很有趣,如果有3个或更多元素呢?第二种变体对我当前的任务不好。@nCdy:如果有三个或更多的元素,你必须使用模式匹配或定义自己的访问器,即让fst_of_3x、x、x=x让snd_of_3、x、x=x等。@nCdy:除了反射之外,它是唯一的一个元素,在编译时知道类型的任何情况下,我怀疑这是一个更好的解决方案。正如我所说,您可以定义自己的访问器,但在某一点上,您必须进行模式匹配-这是没有办法的。但是,有没有办法使序列返回的不是元组列表,而是数组列表或结构列表?@ncdy:您可以生成[| x,y |]来获得数组序列,但我的印象是,在你的例子中,元素有不同的类型,我假设p.Num是int或float,首先是fst。谢谢,这是我当前问题的解决方案,但很有趣,如果有3个或更多元素呢?第二种变体对我当前的任务不好。@nCdy:如果有三个或更多的元素,你必须使用模式匹配或定义自己的访问器,即让fst_of_3x、x、x=x让snd_of_3、x、x=x等。@nCdy:除了反射之外,它是唯一的一个元素,在编译时知道类型的任何情况下,我怀疑这是一个更好的解决方案。正如我所说,您可以定义自己的访问器,但在某一点上,您必须进行模式匹配-这是没有办法的。但是,有没有办法使序列返回的不是元组列表,而是数组列表或结构列表?@ncdy:您可以生成[| x,y |]来获得数组序列,但是我的印象是,在你的例子中,元素有不同的类型,我假设p.Num是int或float,表达式中嵌入的let是+1。当你习惯于基于语句的语言时,很容易忘记你能做到这点。@Joh-真的!
我相信理解F的非轻量级语法确实有助于您对语言有更深的理解,请参见:。让绑定作为一个很好的例子,在使用轻量级语法时,很容易将它们误认为命令式赋值语句。对于初学者来说,调和F中的一切都是表达式的断言可能会令人困惑。话虽如此,我绝对是轻语法的粉丝+1表示表达式中嵌入的let。当你习惯于基于语句的语言时,很容易忘记你能做到这点。@Joh-真的!我相信理解F的非轻量级语法确实有助于您对语言有更深的理解,请参见:。让绑定作为一个很好的例子,在使用轻量级语法时,很容易将它们误认为命令式赋值语句。对于初学者来说,调和F中的一切都是表达式的断言可能会令人困惑。话虽如此,我绝对是轻语法的粉丝!
let str = "hello" + (let (_,name) = x.[1] in name)