Как получить доступ к элементам словаря? - PullRequest
7 голосов
/ 07 июня 2010

Я занимаюсь разработкой веб-приложения на 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 ]

8 голосов
/ 07 июня 2010

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> здесь. Вы можете получить к ним доступ с помощью целочисленного индекса.

6 голосов
/ 07 июня 2010

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

Если вы не хотите использовать строковые ключи, почему вы используете Dictionary<string, string> для начала? Можете ли вы использовать List<string> или Dictionary<int, string>?

Обратите внимание: как только вы сможете правильно использовать индексатор, вам не нужно приводить к строке.

3 голосов
/ 08 июня 2010

Вот фрагмент кода, который будет делать то, что вам нужно, я думаю ... Вы должны будете добавить оператор 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;
  }
}
1 голос
/ 07 июня 2010

Я не могу понять, что на самом деле вы ищете, поэтому вот мой маленький совет. Существует способ просмотра словаря, не запрашивая элементы по ключу. Это опция 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
}
1 голос
/ 07 июня 2010

Если ваши ключи "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, поскольку объект словаря уже будет возвращать строки.

0 голосов
/ 07 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...