我有一本字典:
Dictionary<string, string> valuesDict = new Dictionary<string, string> {
{“Q1”, “A1”},
{“Q2”, “A2”},
{“Q3”, “A3”},
{“Q4”, “A4”} /*20000 Q and A pairs*/
};
为了将此加载到仅接受对象列表(类QuestionAnswer)的第三方接口,我手动将其转换为类似的列表
Public Class QuestionAnswer {
Public string Question;
Public string Answer;
}
然后在循环中创建QuestionAnswer类的对象
List<QuestionAnswer> qaList = new List<QuestionAnswer>();
foreach(var key in valuesDict.Keys) {
qaList.add(new QuestionAnswer {Question = key, Answer = valuesDict[key]});
}
我想知道是否有更快的方法从字典中填充此列表。
到目前为止我找到了什么: 在寻找解决方案时,我遇到了将简单字典转换为简单类型列表的解决方案,如下所示:Convert dictionary to List<KeyValuePair> 请有人帮我解决一下这个问题。 我也对任何可以消除这种开销的其他解决方案持开放态度。
答案 0 :(得分:6)
您正在对密钥进行不必要的查找:
foreach(var item in valuesDict) {
qaList.add(new QuestionAnswer {Question = item.Key, Answer = item.Value});
}
您还可以在初始化时提供列表计数以避免调整大小:
List<QuestionAnswer> qaList = new List<QuestionAnswer>(valuesDict.Keys.Count);
您可以使用基于LinQ的解决方案,但这是slower,您需要寻求最佳解决方案。
答案 1 :(得分:4)
您可以通过将字典的每个KeyValuePair
投影到QuestionAnswer
对象中来创建包含LINQ的列表:
var qaList =
valuesDict.Select(kvp => new QuestionAnswer { Question = kvp.Key, Answer = kvp.Value })
.ToList()
答案 2 :(得分:0)
更快?嗯,是的,绝对,直接迭代字典,而不是Keys
集合:
foreach(var kv in valuesDicts) {
qaList.add(new QuestionAnswer {Question = kv.Key, Answer = kv.Value});
或者更好的是,使用System.Linq
:
valuesDict.Select(kv => new QuestionAnswer(kv.Key, kv.Value);
在您的代码中,您每次迭代都会执行不必要的密钥搜索。
答案 3 :(得分:0)
基本上是两种常见的方法。使用foreach或LINQ。要检查性能,您可以使用秒表并运行如下的简单代码:
Dictionary<string, string> valuesDict = new Dictionary<string, string>();
for (uint i = 0; i < 60000; i++)
{
valuesDict.Add(i.ToString(), i.ToString());
}
List<QuestionAnswer> qaList;
Stopwatch stp = new Stopwatch();
stp.Start();
//LINQ approach
qaList = valuesDict.Select(kv => new QuestionAnswer { Question = kv.Key, Answer = kv.Value }).ToList();
stp.Stop();
Console.WriteLine(stp.ElapsedTicks);
stp.Restart();
//Foreach approach
qaList = new List<QuestionAnswer>();
foreach (var item in valuesDict)
{
qaList.Add(new QuestionAnswer { Question = item.Key, Answer = item.Value });
}
stp.Stop();
Console.WriteLine(stp.ElapsedTicks);
我的结果: Foreach比LINQ方法快了约30%。