2014-03-28 2 views
0

Я думаю, что это слишком много, но вы хотите спросить. Выполняется код ниже, нужно ли назначать значения tempList полностью отдельному массиву? Я чувствую, что вы могли бы перебирать значения TempList но хотите проверить, прежде чем я сделать изменения:Список <string> Присваивается отдельному массиву

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]; 
} 
+0

Что вы пытаетесь достичь здесь? вы фактически не итерируете. Вы просто возвращаете первое значение tempList. –

+0

Возможно ли переполнение 1-го списка второму массиву crMy? – MasterOfStupidQuestions

ответ

2

Нет, не нужен массив, ваш код может быть изменен на:

return tempList.First(); 

или FirstOrDefault в зависимости от следующего кода.

+0

красивый - я думал, что это было излишним, но хотел подтвердить, что b4 вносит изменения, которые взорвались у меня на лице. – MasterOfStupidQuestions

+0

Должно быть, 'if (tempList.Any()) возвращает tempList.First();' для соответствия текущему поведению. – MarcinJuraszek

1

Я считаю, что вы правы, что нет никаких причин для копирования списка в массив в этом конкретном контексте.

Я бы рекомендовал использовать инструкцию using с вашим SqlDataReader, так как это одноразовый объект, и я не вижу здесь никакого кода удаления.

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

Нет необходимости инициализировать новый массив. Вы можете просто перебрать по List<string>. Хотя вам даже нужен Список, потому что вы просто возвращаете первый элемент в списке. Это не позволит вам прочитать каждую строку, например, если у вас есть 1 миллион записей, вам придется их прочитать, прежде чем возвращать первый.

Этот код считывает и непосредственно возвращает первый не нулевое значение:

string result = null; 
using(var reader = cmd.ExecuteReader()){ 
    while (reader.Read()) { 
     if (!reader.IsDBNull(0)) { 
      return resultreader[0].ToString(); 
    } 
} 
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 

Ваш РСУБД благодарит вас. Ваша сеть будет вам благодарна. Ваш код будет работать быстрее, ваши клиенты будут счастливее, и вы можете заменить логику запроса чрезвычайно простым и более умышленным:

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 ; 
} 
Смежные вопросы