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];
}
不,您不需要数组,您的代码可以更改为:
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 ;
}