【问题标题】:Create List of Tuples from List using LINQ使用 LINQ 从列表创建元组列表
【发布时间】: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


【解决方案1】:

可以实现(Tuple&lt;Single, Single&gt; 的示例)并且以下解决方案不是很复杂,但使用循环更清晰 - 在这种特定解决方案的情况下 - 更有效(输入列表被枚举两次)。 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();

【讨论】:

  • 你摇滚。我不知道邮编扩展名。谢谢!
【解决方案2】:

也许这会对某人有所帮助。

var pairs = from p in TheListOfAllLists select (
new Tuple<string, string>( p.ParameterName,p.Value.ToString()));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2022-12-08
    相关资源
    最近更新 更多