【问题标题】:Linq statement to make a list of Int to a list of list of int .NETLinq 语句将 Int 列表制作成 int .NET 列表列表
【发布时间】:2015-01-05 01:53:05
【问题描述】:

我有一个整数列表 [1,2,3,4....100]。 我想使用 Linq 语句使其成为一个新列表: [[1,2],[2,3],[3,4]....[99,100]] 或 [[1,2,3],[2,3,4],[3,4,5].....[98,99,100]] 取决于用户输入的大小。在 VB.NET 中使用 linq 可以做到这一点吗?


应Enigmativity的要求:

给定一个对象列表,我想使用 Linq 对列表中的每 3 个连续项目应用一个函数,然后将它们聚合以获得最终答案:这是一个示例:原始列表:Point2D 列表(每个点具有 X 和 Y 坐标),在该列表中,每 2 个连续点 (pi,pj) 取 pi.X^2 + pj.Y^2,将所有这些值放入一个新列表中,最后取总和最终名单

【问题讨论】:

  • 你不应该编辑一个问题来改变它的历史——这不是一个维基。您需要使问题的答案易于理解。
  • 谢谢。下次我会记住这一点

标签: .net vb.net linq functional-programming


【解决方案1】:

这很容易。试试这个:

Dim build As Func(Of Integer, Integer()()) = Function (n) _
    Enumerable _
        .Range(1, 100)
        .Take(100 - n) _
        .Select(Function (x) Enumerable.Range(x, n).ToArray()) _
        .ToArray()

Dim result = build(2)

只需将您想要的任何有效数字作为build 的参数即可。


这对您修改后的问题有用吗?

Dim query = _
    points _
        .Zip(points.Skip(1), Function (p0, p1) p0.X * p0.X + p1.Y * p1.Y) _
        .Sum()

请注意,当您谈论选择 3 点时,您的问题不是很清楚,但是您的示例仅使用 2。

【讨论】:

  • 谢谢,我想我应该让我原来的问题更清楚一点。在问题中,我只以一个整数列表为例。但我的目标是:给定一个对象列表,我想使用 Linq 对列表中的每 3 个连续项目应用一个函数,然后将它们聚合以获得最终答案:这是一个示例:原始列表:Point2D 列表(每个点都有 X 和 Y 坐标),在该列表中,每 2 个点 (p1,p2) 取 p1.X^2 + p2.Y^2,将所有这些值放到一个新列表中,最后取最终列表的总和。
  • @N.T.C - 很好,但您应该编辑您的问题或提出一个新问题。在评论中询问它不是完成的事情 - 尤其是在答案中的评论。
  • @Enigmativity- 完美运行。现在对于更广泛的图片,例如,如果计算涉及 3 个连续项目,我想我将不得不使用 points.Zip(points.Skip(1),points.Skip(2), Function(p0,p1,p2) ....) ?而且我不确定这是否比使用普通的 For 循环慢。我可以做正常的 for 循环,但我一直在尝试在 VB.NEt 中应用函数式编程
  • @N.T.C - 如果您想将Zip 用于两个以上,则需要将它们链接在一起(这很乏味)。您最好下载 Microsoft Reactive Framework 团队的“交互式扩展”(NuGet“Ix-Main”),它有一个非常好的Buffer 可枚举运算符。然后你可以做Enumerable.Range(0, 10).Buffer(3, 1).Take(10 - 2),这将组成三人一组。 Buffer 的第一个参数是每组的计数。下载它 - 你会发现许多有用的可枚举运算符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多