Конвертировать лямбда-функцию C# в VB.net
У меня есть эта функция, которая сопоставляет IDataReader с классом. Это явно написано на C#. Мой сотрудник хочет использовать тот же метод в своем коде, но он пишет на VB.net. По сути, мне трудно переписать это из-за лямбда-выражений, используемых в C#. Он работает.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;
};
3 ответа
IIRC VB.NET в.NET 3.5 не поддерживает анонимные функции с телом. Ваш коллега, использующий VB.NET, должен будет определить функцию, содержащую этот код, и в лямбда-выражении использовать эту функцию. Теперь, как говорится, на самом деле нет необходимости использовать сложную функцию с телом в этом случае, и этот код можно упростить до:
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), который не поддерживает многострочные лямбда-выражения. Таким образом, вы не можете разделить его на 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") _
}