获取 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);
如果目的是输出列表中每个KeyValuePair
的Value
属性,我们需要先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));
我知道这个答案忽略了您提供的大部分代码,但在我看来,您显示的代码并不是导致您描述的输出的原因。希望这对一些人有所帮助。 :)
我正在开发一个 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);
如果目的是输出列表中每个KeyValuePair
的Value
属性,我们需要先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));
我知道这个答案忽略了您提供的大部分代码,但在我看来,您显示的代码并不是导致您描述的输出的原因。希望这对一些人有所帮助。 :)