获取 System.Collections.Generic.List1[System.Collections.Generic.KeyValuePair2[System.Int32,System.String]] 而不是字符串

getting System.Collections.Generic.List1[System.Collections.Generic.KeyValuePair2[System.Int32,System.String]] instead of string

我正在开发一个 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?"},
};

我的目标是从数据库中提取 "Welcome, How are you?"、"Tell me something about yourself" 等值。为了实现这一点,我这样做了:

编辑:

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 // 这是 Bot

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

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

我在 GetChats(Id) 方法中将 Id 值作为 1 传递。所以基于此,我应该得到相应的值。

NameStepAsync 方法中,我收到了一个不寻常的父 class 我猜而不是我期望的实际字符串。:

System.Collections.Generic.List1[System.Collections.Generic.KeyValuePair2[System.Int32,System.String]].

有人知道为什么会这样吗?

谢谢。

我没有正确理解你的问题,但你可以尝试下面的代码或分享更多信息

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;
}

您描述的输出是 Object.ToString 方法的默认行为,即 return 对象类型的完全限定名称。由于 List<T> 不会覆盖 ToString,您看到的是您所描述的输出。

可以通过以下方式复制:

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

如果目的是输出列表中每个KeyValuePairValue属性,我们需要先select从每个属性列表中的项目。例如:

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));

我知道这个答案忽略了您提供的大部分代码,但在我看来,您显示的代码并不是导致您描述的输出的原因。希望这对一些人有所帮助。 :)