将c# lambda函数转换为VB.net

本文关键字:VB net 转换 函数 lambda | 更新日期: 2023-09-27 18:10:42

我有这个函数将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# lambda函数转换为VB.net

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

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") _
}

Easy:

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版本中,您可以省略恼人的显式行延续(_)。

我刚刚尝试了这个,它没有问题转换代码:

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") _
}