【问题标题】:Translating following piece of VB.NET code to Lambda/ LINQ将以下 VB.NET 代码翻译成 Lambda/LINQ
【发布时间】:2018-05-15 21:15:03
【问题描述】:

展示的代码用于在非常大的数据集中查找缺失的记录。假设 gA 表示正确数据集的记录数。另一个应用程序提供 gB 数据集,其记录编号应该与 gA 相同。即使丢失的记录数量很少(总共 36886 条记录中的 19 条),它也阻止了我进一步计算。整个实用程序是用 LambdaLINQ 混合编写的,因此希望将其转换为看起来相同...

    Dim gA As New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9}
    Dim gB As New List(Of Integer) From {2, 4, 5, 6, 7, 9}

    Dim rA, rB As Integer
    For Each recA As Integer In gA
        Dim recB As Integer = gB(rA)
        If recA = recB Then
            rA += 1
        Else
            rB += 1
            Console.WriteLine("{0} missing record: {1}", rB, recA)
        End If
    Next
    ' Output:
    '1 missing record: 1
    '2 missing record: 3
    '3 missing record: 8

【问题讨论】:

  • 有什么问题?
  • 将以下 VB.NET 代码翻译成 Lambda/LINQ
  • 如果gB = From {8, 2, 4, 5, 6, 7, 9},输出应该是什么?
  • 只是需要考虑的事情...如果其余代码是用 lambdas 和 linq 编写的,但这部分不是,可能需要在更改之前考虑是否有原因。与简单的 for 循环相比,Linq 在大型数据集上的表现不如简单的 for 循环,因此如果此操作代价高昂,则可能不是故意使用 linq。也就是说,您真正需要的只是gA.Except(gB),这将使您得到 B 中缺少的 A 中的数字
  • OP 的代码不能像gA.Except(gB) 那样做。

标签: vb.net linq lambda


【解决方案1】:

看来你正在寻找Enumerable.Except() method

Dim gA As New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9}
Dim gB As New List(Of Integer) From {2, 4, 5, 6, 7, 9}
DIm diff = gA.Except(gB).ToList()

以上代码生成Integers的列表:{1, 3, 8}

【讨论】:

  • Except() 方法不执行 OP 代码的功能。见this comment
  • 是的,确实如此。你最终得到一个 {1, 3, 8} 的集合。剩下的就是迭代它并将其写入控制台,他不再需要 rA 和 rB 计数,因为这些可以从新集合的计数中推断出来。
  • @soohoonigan,这实际上可能是 OP 试图实现的目标,但它没有执行问题中的代码所做的事情。对gB = From {8, 2, 4, 5, 6, 7, 9} 运行这两种方法,如果结果相同,请告诉我。
  • @AhmedAbdelhameed,正如我的前任所说,确实如此。 Op 正在寻找丢失的记录 - 据我了解他的问题。 BTW:他不需要精确的代码翻译。他需要得到想要的结果。
  • 我在之前的评论开始时说“这实际上可能是 OP 试图实现的目标”。但是,根据问题中的代码。这两种行为并不完全相同。这就是我想指出的。
【解决方案2】:

简单的“翻译”是:

var gA = new List<Int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var gB = new List<Int>() { 2, 4, 5, 6, 7, 9 };

int rA, rB;

gA.ForEach(recA =>
{
    gB.ForEach(recB =>
    {
        if (recA == recB)
        {
            rA++;
        }
        else
        {
            rB++;
            Console.WriteLine("{0} missing record: {1}", rB, recA);
        }
    });
})

但是另一种方法是使用Contains

gA.ForEach(recA =>
{
    if (gB.Contains(recA))
    {
        rA++;
    }
    else
    {
        rB++;
        Console.WriteLine("{0} missing record: {1}", rB, recA);
    }
})

最后一个更简洁的选项是在结果集合中使用ExceptForEach

gA.Except(gB).ForEach((item, idx) => Console.WriteLine("{0} missing record: {1}", idx, item));

【讨论】:

  • 最终解决方案值得支持,即使我认为 OP 不需要精确的“翻译”。
  • 我同意你的观点,我更喜欢最后的方法,但有选择永远不会有坏处。
  • J. Pichardo 好的,谢谢,实际上,这篇文章标题中的“翻译”一词非常不恰当,@soohoonigan 从一开始就非常聪明地提出了使用 except() 方法的最简单解决方案。最好的问候!
  • 这是 C#。您不能将一点 C# 放入 vb 文件中。
猜你喜欢
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多