List <string>分配给Separate Array </string>

时间:2014-03-28 19:06:49

标签: c#

我认为这有点矫枉过正,但想问一下。正在运行以下代码,是否需要将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];
}

4 个答案:

答案 0 :(得分:2)

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

return tempList.First();

FirstOrDefault取决于后面的代码。

答案 1 :(得分:2)

不需要初始化新阵列。您可以简单地遍历List<string>。 虽然你甚至需要一个List,因为你只是返回列表中的第一个元素。这将阻止您阅读每一行,例如,如果您有100万个条目,则必须先阅读它们,然后再返回第一行。

此代码读取并直接返回第一个非空值:

string result = null;
using(var reader = cmd.ExecuteReader()){
    while (reader.Read()) {
        if (!reader.IsDBNull(0)) { 
            return resultreader[0].ToString(); 
    }
}

答案 2 :(得分:1)

我相信您已经纠正了在这个特定情况下没有理由将List复制到数组中。

我建议在你的SqlDataReader中使用using语句,因为它是一次性对象,我在这里没有看到任何处理代码。

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

答案 3 :(得分:0)

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

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 ;
}