【发布时间】:2013-05-29 08:25:59
【问题描述】:
我正在尝试使用 LINQ 从列表中创建元组列表,但不知道该怎么做。我得到的是外部文件中的各种数据,我正在使用标准方法将部分读取到List<Single>,然后我需要将其转换为该列表的顺序元素组列表(可能有组中的元素数量可变)。换一种说法:
List<Single> with n elements goes to List<Tuple<Single, Single>> with (n/2) elements
或
List<Single> with n elements goes to List<Tuple<Single, Single, Single>> with (n/3) elements
我不知道如何使用 LINQ 执行此操作,因此我已恢复为 for 循环,例如:
For i As Integer = 0 To CType(coords.Item2.Count / 3, Integer) Step 3
normalList.Add( _
New Tuple(Of Single, Single, Single)( _
coords.Item2.Item(i), _
coords.Item2.Item(i + 1), _
coords.Item2.Item(i + 2) _
) _
)
Next i
编辑:我一点也不担心通用解决方案,我感兴趣的是是否可以使用 LINQ 来做这种事情。这似乎超出了预期的分数,但我没有足够的感觉来知道这是否属实。
我的问题是是否可以使用 LINQ 完成上述类型的任务。我在 UI 和 google 中翻来覆去,但都是空的!
【问题讨论】:
-
真的不可能,除了为每个可能出现的
n编写代码之外,在强类型环境中执行此操作。 (就像有很多Tuple类型一样)。您要么必须使用动力学,要么冒险进入 F#,这将是花生。 (但无论如何都需要一个带有动态的 VB 接口)。 -
@GertArnold 我不太担心通用解决方案 - 我正在尝试找出是否可以使用 LINQ 来完成任何一个可能示例的任务。我怀疑一旦我知道如何做一个例子,我可以使解决方案更通用。我已经编辑了我的问题以使其更清楚。谢谢!
-
超出预期目标 没错。 LINQ 非常适用于集合操作(Where、Except、Union 等),不适用于顺序操作。可以编写 extension methods 将 IEnumerable 切割成指定数量元素的块,但您可以争论这是否仍然是 LINQ。通常经典的
For/ForEach看起来不那么复杂。 -
@GertArnold 嗯。是这样想的——我认为这可能是可行的,但这会很糟糕。我已经做到了: Dim x As New List(Of Single)({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) Dim o As Object = x.Select(元组(整数,单))(函数(val,索引)新元组(整数,单)(CType(System.Math.Floor(索引/ 2),整数),val)).GroupBy(函数(i ) i.Item1)... 这让我得到了一个分组集 - 我只需要弄清楚如何将它们聚合回列表然后再聚合成元组 - 比我如何做到这一点更胜一筹
标签: .net linq list tuples enumerable