将字典转换为C#中的对象列表

Gan*_*zy' 3 c# dictionary list

我有一本字典:

Dictionary<string, string> valuesDict = new Dictionary<string, string> {
    {“Q1”, “A1”},
    {“Q2”, “A2”},
    {“Q3”, “A3”},
    {“Q4”, “A4”} /*20000 Q and A pairs*/
};
Run Code Online (Sandbox Code Playgroud)

为了将其加载到仅接受对象列表(类QuestionAnswer)的第三方接口,我手动将其转换为如此列表

Public Class QuestionAnswer {
    Public string Question;
    Public string Answer;
}
Run Code Online (Sandbox Code Playgroud)

然后在循环内创建QuestionAnswer类的对象

List<QuestionAnswer> qaList = new List<QuestionAnswer>();
foreach(var key in valuesDict.Keys) {
    qaList.add(new QuestionAnswer {Question = key, Answer = valuesDict[key]});
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更快的方法从字典中填充此列表.

到目前为止我发现了什么: 在寻找解决方案时,我遇到了一个简单的Dictionary转换为简单类型列表的解决方案,如下所示:将字典转换为List <KeyValuePair> 有人可以帮我利用这个解决方案我的情况请.我也对任何可以消除这种开销的其他解决方案持开放态度.

Ser*_*kiy 7

您可以通过将每个KeyValuePair字典投影到您的QuestionAnswer对象中来使用 LINQ 创建一个列表:

 var qaList = 
    valuesDict.Select(kvp => new QuestionAnswer { Question = kvp.Key, Answer = kvp.Value })
              .ToList()
Run Code Online (Sandbox Code Playgroud)


Zei*_*kki 6

你正在对密钥进行不必要的查找:

foreach(var item in valuesDict) {
    qaList.add(new QuestionAnswer {Question = item.Key, Answer = item.Value});
}
Run Code Online (Sandbox Code Playgroud)

您还可以在初始化时提供列表计数以避免调整大小:

List<QuestionAnswer> qaList = new List<QuestionAnswer>(valuesDict.Keys.Count);
Run Code Online (Sandbox Code Playgroud)

您可以使用基于LinQ的解决方案,但这样做速度较慢,您需要最佳解决方案.