【发布时间】:2019-01-14 03:14:44
【问题描述】:
我有以下 VB.net 代码:
Private Function ReorgFileDataset(ByRef InDataSet As DataSet) As DataSet
Dim _ResultDataRow, _DataRow As DataRow
Dim _ResultDataSet As New DataSet
Dim _ResultDataTable As New DataTable
_ResultDataSet.Tables.Add(_ResultDataTable)
Dim ColumnName, Value As String
Dim FileID As Integer
For Each _DataRow In InDataSet.Tables(0).Rows
ColumnName = _DataRow.Item("FKP_KEYWORD")
If Not _ResultDataTable.Columns.Contains(ColumnName) Then
_ResultDataTable.Columns.Add(ColumnName)
End If
Next
_ResultDataTable.Columns.Add("DATE_SENT")
_ResultDataRow = Nothing
For Each _DataRow In InDataSet.Tables(0).Rows
If FileID <> _DataRow.Item("FD_RID") Then
If Not _ResultDataRow Is Nothing Then
_ResultDataTable.Rows.Add(_ResultDataRow)
End If
FileID = _DataRow.Item("FD_RID")
_ResultDataRow = _ResultDataTable.NewRow()
_ResultDataRow.Item("DATE_SENT") = _DataRow.Item("FD_LASTMODIFIED")
End If
If _DataRow.Item("FKP_KEYWORD").GetType IsNot GetType(DBNull) And _
_DataRow.Item("FKP_VALUE").GetType IsNot GetType(DBNull) Then
ColumnName = _DataRow.Item("FKP_KEYWORD")
Value = _DataRow.Item("FKP_VALUE")
_ResultDataRow.Item(ColumnName) = Value
End If
Next
If _ResultDataRow IsNot Nothing Then
_ResultDataTable.Rows.Add(_ResultDataRow)
End If
Return _ResultDataSet
End Function
当我通过转换器运行它时,我得到了这个 C# 代码:
private DataSet ReorgFileDataset(DataSet InDataSet)
{
DataRow _ResultDataRow = default(DataRow);
DataSet _ResultDataSet = new DataSet();
DataTable _ResultDataTable = new DataTable();
_ResultDataSet.Tables.Add(_ResultDataTable);
string ColumnName = null;
string Value = null;
int FileID = 0;
foreach (DataRow _DataRow in InDataSet.Tables[0].Rows) {
ColumnName = _DataRow.Item("FKP_KEYWORD");
if (!_ResultDataTable.Columns.Contains(ColumnName)) {
_ResultDataTable.Columns.Add(ColumnName);
}
}
_ResultDataTable.Columns.Add("DATE_SENT");
_ResultDataRow = null;
foreach (DataRow _DataRow in InDataSet.Tables[0].Rows) {
if (FileID != _DataRow.Item("FD_RID")) {
if ((_ResultDataRow != null)) {
_ResultDataTable.Rows.Add(_ResultDataRow);
}
FileID = _DataRow.Item("FD_RID");
_ResultDataRow = _ResultDataTable.NewRow();
_ResultDataRow.Item("DATE_SENT") = _DataRow.Item("FD_LASTMODIFIED");
}
if (!object.ReferenceEquals(_DataRow.Item("FKP_KEYWORD").GetType, typeof(DBNull)) & !object.ReferenceEquals(_DataRow.Item("FKP_VALUE").GetType, typeof(DBNull))) {
ColumnName = _DataRow.Item("FKP_KEYWORD");
Value = _DataRow.Item("FKP_VALUE");
_ResultDataRow.Item(ColumnName) = Value;
}
}
if (_ResultDataRow != null) {
_ResultDataTable.Rows.Add(_ResultDataRow);
}
return _ResultDataSet;
}
我将InDataSet.Tables(0) 修改为InDataSet.Tables[0] 但是,由于智能没有DataRow 的Item 属性,有几个错误我无法修复。我也不确定检查 Null 的最后一个 if 语句。
我可以在这里寻求帮助吗?
【问题讨论】:
-
您遇到了什么错误?
DataRow.Item是 C# 中的有效属性,就像它在 VB.NET 中一样。最后一行相当于 VB.NET 代码中的最后一行 - 如果DataRow不为空,则将其添加到结果中。null对于 C# 就像Nothing对于 VB.NET。 -
项目索引器隐含在 C# 类型中,因此在 VB 中如果您使用
_DataRow.Item(),在 C# 中它将是_DataRow[]。对于转换器来说,这是一件很难接受的事情,因为您可以拥有一个名为Item的 C# 属性或方法,因此它通常会走安全的道路并将其放在那里迫使您修复它们。 -
正如我所说,DataRow 中没有 Item 属性显示在 Intellisense 中,只有 ItemArray。
-
C# 将
Item(string)或Item(int)更改为[string]或[int],它不会在Intellisense 中显示,因为它不存在。它显示在 MSDN 上,因为它在 VB 中。您需要将_DataRow.Item("")调用更改为_DataRow[""]。