получение System.Collections.Generi c .List1 [System.Collections.Generi c .KeyValuePair2 [System.Int32, System.String]] вместо строки - PullRequest
0 голосов
/ 08 января 2020

Я работаю над проектом MS Bot Framework , где я получаю значение из пары ключ-значение из базы данных в C#. Ранее у меня было это:

var list = new List<KeyValuePair<int, string>>()
{
     new KeyValuePair<int, string>(obj,_Obj.Questions)
};

Dictionary<int, string> d = new Dictionary<int, string>
{
  { 1, "Welcome, How are you?" },
  { 2, "Tell me something about yourself."},
  { 3, "How much experience do you have?"},
};

Моя цель состояла в том, чтобы принести Ценности, такие как «Добро пожаловать, как дела?», «Расскажите мне что-нибудь о себе» и т. Д. c из базы данных. Чтобы добиться этого, я сделал это:

Редактировать:

Questions.cs

public static string GetChats(int Id)
{


   using (SqlCommand cmd = new SqlCommand("usp_FetchData", con))
   {
   var list = new List<KeyValuePair<int, string>>();

   DataTable dt = new DataTable();
   cmd.CommandType = System.Data.CommandType.StoredProcedure;

   cmd.Parameters.AddWithValue("@id", Id);

   SqlDataAdapter da = new SqlDataAdapter(cmd);
   da.Fill(dt);

   con.Open();

   SqlDataReader reader = cmd.ExecuteReader();

   if (reader.HasRows)
   {
      foreach (DataRow row in dt.Rows)
      {
        string queMsg = row["Description"]?.ToString();
        list.Add(new KeyValuePair<int, string>(Id, queMsg));
      }
    }

 // class property

 public string WelcomeStmt = GetChats(1).ToString();

И значение Сверху функция получается в этом методе:

MyDialog.cs // это диалог для бота

private static async Task<DialogTurnResult> **NameStepAsync**(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{

  return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text(questions.AskName) }, cancellationToken);
}

Я передаю значение Id как 1 в методе GetChats (Id) . Исходя из этого, я должен получить соответствующее значение.

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

System.Collections.Generi c .List1 [System.Collections.Generi c .KeyValuePair2 [System.Int32, System.String]].

Кто-нибудь знает, почему это происходит?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Выходные данные, которые вы описываете, представляют собой поведение по умолчанию метода Object.ToString, который должен возвращать полностью определенное имя типа объекта. Поскольку List<T> не переопределяет ToString, вы видите результат, который вы описали.

Его можно воспроизвести:

Console.WriteLine(list.ToString());   // Or just: Console.WriteLine(list);

enter image description here

Если мы хотим вывести свойство Value каждого KeyValuePair в списке, нам нужно сначала выбрать это свойство из каждого элемента в списке. Например:

var list = new List<KeyValuePair<int, string>>()
{
    new KeyValuePair<int, string> (1, "Welcome, How are you?" ),
    new KeyValuePair<int, string> (2, "Tell me something about yourself."),
    new KeyValuePair<int, string> (3, "How much experience do you have?"),
};

list.ForEach(kvp => Console.WriteLine(kvp.Value));

enter image description here

Я понимаю, что этот ответ игнорирует большую часть предоставленного вами кода, но мне не кажется, что код, который вы показали, является причиной того, что вы описали. Надеюсь, это поможет некоторым. :)

0 голосов
/ 08 января 2020

Я не правильно понял ваш вопрос, но вы можете попробовать код ниже или поделиться дополнительной информацией

int idn=0;
foreach (DataRow row in dt.Rows)
{
    string queMsg = row["Description"].ToString();
    list.Add(new KeyValuePair<int, string>(idn, queMsg));
    idn=idn+1;
}
...