【问题标题】:Convert C# lambda function to VB.net将 C# lambda 函数转换为 VB.net
【发布时间】:2011-10-06 21:26:00
【问题描述】:

我有一个将 IDataReader 映射到类的函数。它显然是用 C# 编写的。我的同事想在他的代码中使用相同的方法,但他正在用 VB.net 编写。基本上,由于 C# 中使用的 Lambda 表达式,我很难重写它。他正在运行 .Net 3.5。

谁能帮帮我?

private Func<IDataReader, ScanItem> resultMapper = r =>
    {
        var si = new ScanItem()
        {
            StoreGroupCode = r.ToInt32("GRP_CDE"),
            StoreCode = r.ToInt32("STOR_CDE"),
            EventNumber = r.ToInt32("EVENT_NUM"),
            AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"),
            LabelNumber = r.ToInt32("LBL_NUM"),
            ScanType = r.ToString("INV_SCAN_TYP_IND"),
            SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"),
            UPC = r.ToLong("VEN_UPC_NUM"),
            ActualQuantity = r.ToLong("ACT_CNT_QTY")
        };

        return si;
    };

【问题讨论】:

  • 请务必将有助于您的答案标记为已接受,并且您应该对其他问题也这样做(即使您给出了最佳答案)。

标签: c# vb.net lambda idatareader


【解决方案1】:

.NET 3.5 中的 IIRC VB.NET 不支持带有正文的匿名函数。您使用 VB.NET 的同事必须定义一个包含此代码的函数,并在 lambda 表达式中使用此函数。现在,话虽如此,在这种情况下,实际上没有必要使用带有 body 的复杂函数,这段代码可以简化为:

private Func<IDataReader, ScanItem> resultMapper = r => new ScanItem
{
    StoreGroupCode = r.ToInt32("GRP_CDE"),
    StoreCode = r.ToInt32("STOR_CDE"),
    EventNumber = r.ToInt32("EVENT_NUM"),
    AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"),
    LabelNumber = r.ToInt32("LBL_NUM"),
    ScanType = r.ToString("INV_SCAN_TYP_IND"),
    SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"),
    UPC = r.ToLong("VEN_UPC_NUM"),
    ActualQuantity = r.ToLong("ACT_CNT_QTY")
};

如果我的 VB.NET 不太生锈,通常应该看起来像这样:

Private resultMapper As Func(Of IDataReader, ScanItem) = Function(r) New ScanItem() With { _
    .StoreGroupCode = r.ToInt32("GRP_CDE"), _
    .StoreCode = r.ToInt32("STOR_CDE"), _
    .EventNumber = r.ToInt32("EVENT_NUM"), _
    .AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"), _
    .LabelNumber = r.ToInt32("LBL_NUM"), _
    .ScanType = r.ToString("INV_SCAN_TYP_IND"), _
    .SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"), _
    .UPC = r.ToLong("VEN_UPC_NUM"), _
    .ActualQuantity = r.ToLong("ACT_CNT_QTY") _
}

【讨论】:

  • 发帖者的匿名方法并不需要正文。它可以很容易地简化成一行......
【解决方案2】:

简单:

Private resultMapper As Func(Of IDataReader, ScanItem) = Function (r) _
    New ScanItem() With { _
        .StoreGroupCode = r.ToInt32("GRP_CDE"), _
        .StoreCode = r.ToInt32("STOR_CDE"), _
        .EventNumber = r.ToInt32("EVENT_NUM"), _
        .AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"), _
        .LabelNumber = r.ToInt32("LBL_NUM"), _
        .ScanType = r.ToString("INV_SCAN_TYP_IND"), _
        .SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"), _
        .UPC = r.ToLong("VEN_UPC_NUM"), _
        .ActualQuantity = r.ToLong("ACT_CNT_QTY") _
    }

在较新版本的 VB 中,您可以省略烦人的显式续行 (_)。

【讨论】:

  • Func&lt;IDataReader, ScanItem&gt; 应该是Func(Of IDataReader, ScanItem)
  • 如何编译?你在声明中有两次 resultMapper!
  • @Chris Typo。感谢您发现它。
【解决方案3】:

我刚试过,转换代码没有问题:

http://www.developerfusion.com/tools/convert/csharp-to-vb/

唯一需要注意的是 VB.NET 9 (VS 2008/.NET 3.5) 不支持多行 lambda 表达式。所以你不能把它分成两行。

所以...

Private resultMapper As Func(Of IDataReader, ScanItem) = Function(r) New ScanItem() With { _
    .StoreGroupCode = r.ToInt32("GRP_CDE"), _
    .StoreCode = r.ToInt32("STOR_CDE"), _
    .EventNumber = r.ToInt32("EVENT_NUM"), _
    .AreaNumber = r.ToInt32("INV_CTL_AREA_CDE"), _
    .LabelNumber = r.ToInt32("LBL_NUM"), _
    .ScanType = r.ToString("INV_SCAN_TYP_IND"), _
    .SequenceNumber = r.ToInt32("INV_SCAN_SEQ_NUM"), _
    .UPC = r.ToLong("VEN_UPC_NUM"), _
    .ActualQuantity = r.ToLong("ACT_CNT_QTY") _
}

【讨论】:

  • 自动转换器有点混乱。 Key 关键字不属于这里,因为这不是匿名类。
猜你喜欢
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多