我的问题的根源是C#编译器太聪明了。它检测到一个可以通过其定义对象的路径,因此要求我填充它。在代码中,我查看DataSet中的表以查看是否存在我想要的表。如果没有,我会创建一个新的。我知道dtOut将始终被赋值,但编译器不满意,除非在声明时赋值。这是不优雅的。
如何以更优雅的方式重写此内容?
System.Data.DataTable dtOut = new System.Data.DataTable();
.
.
// find table with tablename = grp
// if none, create new table
bool bTableFound = false;
foreach (System.Data.DataTable d1 in dsOut.Tables)
{
string d1_name = d1.TableName;
if (d1_name.Equals(grp))
{
dtOut = d1;
bTableFound = true;
break;
}
}
if (!bTableFound) dtOut = RptTable(grp);
答案 0 :(得分:11)
您可以像这样重写您的方法:
System.Data.DataTable dtOut = dsOut
.Tables
.Cast<System.Data.DataTable>()
.FirstOrDefault(t => t.TableName.Equals(grp))
?? RptTable(grp);
答案 1 :(得分:11)
初始值可以是null
。编译器不要求您创建实例;它只需要你分配一个值。
System.Data.DataTable dtOut = null; // compiler is now happy
// rest of code as before
答案 2 :(得分:1)
...program...
{
System.Data.DataTable dtOut = GetDataTableByName(grp, dsOut);
}
public DataTable GetDataTableByName(string grp, object dsOut)
{
foreach (System.Data.DataTable d1 in dsOut.Tables)
{
if (d1.TableName.Equals(grp))
return RptTable(grp)
}
return null;
}
如果我正确地填写了您的命名。
答案 3 :(得分:0)
var dtOut = dsOut != null && dsOut.Tables != null && dsOut.Tables[grp] != null
? dsOut.Tables[grp]
: RptTable(grp);
HTH
答案 4 :(得分:0)
我喜欢Otávio的回答,但无论如何,这是另一种方法。您可以将foreach循环推送到自己的方法中,例如:
static System.Data.DataTable
getDataTable ( System.Data.DataTable[] tables, String grp )
{
foreach (System.Data.DataTable d1 in tables)
{
string d1_name = d1.TableName;
if (d1_name.Equals(grp))
{
return d1;
}
}
return null;
}
这使您可以将原始方法简化为:
System.Data.DataTable dtOut = getDataTable(dsOut.Tables, grp);
if (!dtOut) dtOut = RptTable(grp);
答案 5 :(得分:0)
如果你想要优雅,请去LINQ:
var dtOut =
dsOut.Tables.FirstOrDefault(t => t.TableName == grp)
?? RptTable(grp);