如何避免以优雅的方式创建不需要的对象?

时间:2010-04-07 21:04:55

标签: c#

我的问题的根源是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);

6 个答案:

答案 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);