List< string>分配给独立数组

本文关键字:独立 数组 分配 string List | 更新日期: 2023-09-27 17:54:30

我觉得这太过分了,但是我想问一下。下面的代码正在运行,是否有必要将tempList的值分配给一个完全独立的数组?我觉得你可以迭代tempList的值,但希望在我做出改变之前进行验证:

List<string> tempList = new List<string>();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
  try
  {
    if (!reader.IsDBNull(0))
    {
      tempList.Add(reader[0].ToString());
    }
  }
  catch
  {
  }
}
reader.Close();
crMy = tempList.ToArray();
for (int q = crMy.GetLowerBound(0); q <= crMy.GetUpperBound(0); q++)
{
  return crMy[q];
}

List< string>分配给独立数组

不,您不需要数组,您的代码可以更改为:

return tempList.First();

FirstOrDefault取决于后面的代码

不需要初始化一个新数组。您可以简单地遍历List<string>。尽管您甚至需要一个List,因为您只是返回List中的第一个元素。这将防止您读取每一行,例如,如果您有100万个条目,则必须在返回第一个之前读取所有条目。

以下代码读取并直接返回第一个非空值:
string result = null;
using(var reader = cmd.ExecuteReader()){
    while (reader.Read()) {
        if (!reader.IsDBNull(0)) { 
            return resultreader[0].ToString(); 
    }
}

我相信你是正确的,在这个特定的上下文中没有理由将List复制到数组中。

我建议在SqlDataReader中使用using语句,因为它是一个可丢弃的对象,我在这里没有看到任何dispose代码。

using (SqlDataReader reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        try { if (!reader.IsDBNull(0)) { tempList.Add(reader[0].ToString()); } }
        catch { }
    }
}

如前所述,您的代码返回第一行的第一列,该列是非空的。您可以简单地这样写,并完全避免列表。:

static string GetDataValue()
{
  using ( SqlConnection conn = new SqlConnection("your-connect-string-here"))
  using ( SqlCommand    cmd  = conn.CreateCommand() )
  {
    InitializeSqlCommand(cmd) ;
    conn.Open() ;
    using ( SqlDataReader reader = cmd.ExecuteReader() )
    {
      while ( reader.Read() && reader.IsDBNull( 0 ) )
      {
        string value = reader[0].ToString() ;
        return value ;
      }
    }
  }
  throw new InvalidOperationException("no [useful] data returned");
}

这种方法对我来说似乎有点似是而非:你可能会返回大量数据,在网络上读取所有数据,然后扔掉所有数据,除了第一行的第一列,该列是非空的。

您应该修改查询以返回您想要的内容,所以应该像这样(相当开放):

select t.col_1, t.col_2, ... , t.col_n
from foo t

改成更具体的

select top 1 t.col_1
from foo t
where t.col_1 is not null

你的RDBMS会感谢你的。你的关系网会感谢你的。你的代码会运行得更快,你的客户会更高兴,你可以用非常简单和更有意的查询逻辑来代替查询逻辑:

static string GetDataValue()
{
  string value ;
  using ( SqlConnection conn = new SqlConnection("your-connect-string-here"))
  using ( SqlCommand    cmd  = conn.CreateCommand() )
  {
    InitializeSqlCommand(cmd) ;
    conn.Open() ;
    value = (string) cmd.ExecuteScalar() ;
    conn.Close() ;
  }
  if ( value == null ) throw new InvalidOperationException("no data read") ;
  return value ;
}