Как получить доступ к элементам словаря?

Я разрабатываю приложение веб-сайта C# VS2008 / SQL Server и новичок в классе Dictionary. Не могли бы вы посоветовать наилучший способ достижения этой цели? Вот фрагмент кода:

SqlConnection conn2 = new SqlConnection(connString);
SqlCommand cmd = conn2.CreateCommand();
cmd.CommandText = "dbo.AppendDataCT";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn2;
SqlParameter p1, p2, p3;
foreach (string s in dt.Rows[1].ItemArray)
{
    DataRow dr = dt.Rows[1]; // second row
    p1 = cmd.Parameters.AddWithValue((string)dic[0], (string)dr[0]);
    p1.SqlDbType = SqlDbType.VarChar;
    p2 = cmd.Parameters.AddWithValue((string)dic[1], (string)dr[1]);
    p2.SqlDbType = SqlDbType.VarChar;
    p3 = cmd.Parameters.AddWithValue((string)dic[2], (string)dr[2]);
    p3.SqlDbType = SqlDbType.VarChar;
}

но это дает мне ошибку компилятора:

The best overloaded method match for 'System.Collections.Generic.Dictionary<string,string>.this[string]' has some invalid arguments

Я просто хочу получить доступ к каждому значению из " dic " и загрузить в эти параметры SQL. Как мне это сделать? Должен ли я ввести ключ? Ключи называются "от col1", "столбец col2" и т. д. так не самый удобный. Еще какие-нибудь советы? Спасибо!

6 ответов


вы, кажется, пытаетесь получить доступ к Dictionary<string, string> by целое. Вы не можете этого сделать - вы должны искать значение по ключу, который является строкой.

если вы не хотите использовать строковые ключи, почему вы используете Dictionary<string, string> начать? Не могли бы вы использовать List<string> или Dictionary<int, string>?

обратите внимание, что после есть удалось использовать индексатор соответствующим образом, вам не нужно будет бросать в строку.


A Dictionary отображает объекты одного типа в объекты другого типа. В вашем случае у вас есть Dictionary<string, string>. Поэтому, если вы инициализировали его следующим образом:

Dictionary<string, string> dic = new Dictionary<string, string>()
{
   { "key1", "value1" },
   { "key2", "value2" },
   { "key3", "value3" }
};

вы получите значение для key2 делать

dic["key2"]; // gives "value2"

на Dictionary строго типизирован, поэтому нет необходимости в каком-либо литье. Как говорит Джон Скит, вам может быть лучше с List<string> здесь. Вы можете получить доступ к ним по целочисленному индексу.


вот фрагмент кода, который сделает то, что вам нужно, я думаю.. Вам нужно будет добавить оператор else, но он должен заставить вас начать.

public void AttachParam(ref DbCommand command, Dictionary<string, string> parameters)
{
  try
  {
     if (parameters.Count > 0)
     {
        foreach (KeyValuePair<string, string> kvp in parameters)
        {
           command.Parameters.AddWithValue(kvp.Key, kvp.Value);
        }
     }
  }
  catch (Exception ex)
  {
     throw;
  }
}

Если ваши ключи "col1", "col2" и т. д., то использование 0, 1 и т. д. вызовет ошибку, которую вы получаете. Попробуйте это:

p1 = cmd.Parameters.AddWithValue(dic["col1"], dr[0]);
p1.SqlDbType = SqlDbType.VarChar;
p2 = cmd.Parameters.AddWithValue(dic["col2"], dr[1]);
p2.SqlDbType = SqlDbType.VarChar;
p3 = cmd.Parameters.AddWithValue(dic["col3"], dr[2]);
p3.SqlDbType = SqlDbType.VarChar;

кроме того, нет необходимости бросать в string поскольку объект dictionary уже возвращает строки.


да значения должны быть доступны ключом.


Я не могу понять, что на самом деле вы ищете, так вот мой маленький совет. Существует способ просмотра словаря, не запрашивая элементы по ключу. Это вариант foreach.

foreach (KeyValuePair<string,string> pair in dic)
{
    p. = cmd.Parameters.AddWithValue(dic.Value /*or dic.Key*/, (string)dr[0]);
    p.SqlDbType = SqlDbType.VarChar;
    // further processing of this parameter
}