使用LINQ从列表中创建元组列表

4

我想使用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完成上述类型的任务。我在界面和谷歌上尝试了一番,但都没有得到答案!


在强类型环境中,要做到除了为每个可能的 n 写代码以外真的很困难(就像有许多“Tuple”类型)。你只能使用动态语言或者尝试使用 F# 来轻松解决这个问题(但是无论如何都需要一个与动态语言接口的 VB 接口)。 - Gert Arnold
@GertArnold 我不太担心通用解决方案 - 我正在尝试找出是否可以使用LINQ来完成任何一个可能的示例中的任务。我怀疑一旦我知道如何处理单个示例,就可以使解决方案更加通用。我已经编辑了我的问题以使其更清晰。谢谢! - GHC
1
超出预期范围。没错,LINQ非常适合集合操作(Where、Except、Union等),但不适用于顺序操作。可以编写扩展方法将IEnumerable切成指定数量的元素块,但这是否仍然属于LINQ还有争议。通常经典的For/ForEach看起来要简单得多。 - Gert Arnold
@GertArnold 嗯,我也这么认为-我认为可能做到,但这将会非常棘手。 我已经尝试了这个:Dim x As New List(Of Single)({1, 2, 3, 4, 5, 6, 7, 8, 9, 10})Dim o As Object = x.Select(Of Tuple(Of Integer, Single))(Function(val, index) New Tuple(Of Integer, Single)(CType(System.Math.Floor(index / 2), Integer), val)).GroupBy(Function(i) i.Item1)...这让我得到了一个分组集合-我只需要弄清楚如何将它们聚合回列表再转换为元组-然而我不知道该如何做到 - GHC
2个回答

6
也许这能帮助某些人。
var pairs = from p in TheListOfAllLists select (
new Tuple<string, string>( p.ParameterName,p.Value.ToString()));

5

这可以通过以下方式实现(以Tuple<Single, Single>为例),下面的解决方案并不是非常复杂,但使用循环更清晰,并且在这个特定的解决方案中更有效率(输入列表被枚举两次)。 这是C#代码,不知道VB。

var even = inputList.Where((elem, ind) => ind % 2 == 0);
var odd = inputList.Where((elem, ind) => ind % 2 == 1);
var outputList = even.Zip(odd, (a, b) => new Tuple<Single, Single>(a, b)).ToList();

你太棒了。我不知道zip扩展名的事情。谢谢! - GHC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接