[英]Convert C# lambda function to VB.net
我有一个将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;
};
.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") _
}
简单:
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") _
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.