如何使用linq将List<string>转换为Dictionary<string,string>?

5

我有一个字符串列表:

List<string> tList=new List<string>();
tList.add("a");
tList.add("mm");

我希望使用linq将此列表转换为字典,使字典的键和值相同。

我尝试过以下方法:

var dict = tList.ToDictionary<string,string>(m => m, c => c);

但我收到了以下错误消息:

无法将 lambda 表达式转换为类型“ IEqualityComparer”,因为它不是委托类型。


2
你尝试过什么来解决这个问题?你的尝试解决方案中遇到了哪些问题? - Servy
@Servy 我已经更新了我的问题 :) - Ala
2个回答

12

使用ToDictionary方法:

List<string> tList = new List<string>();
tList.add("a");
tList.add("mm");
var dict = tList.ToDictionary(k => k, v => v);

不要忘记添加对 System.Linq 的引用。


就我而言,我始终无法弄清楚我的代码哪里出了问题。我基本上是按照上述做的,但指定了 ToDictionary 的类型参数,如下所示:var dict = tList.ToDictionary<string, string>(k => k, v => v);诀窍在于像这个答案所示那样删除那些类型参数:var dict = tList.ToDictionary(k => k, v => v); - SIRHAMY

5

Here are the signatures for ToDictionary

ToDictionary<TSource, TKey>(
    IEnumerable<TSource>, 
    Func<TSource, TKey>)

ToDictionary<TSource, TKey>(
    IEnumerable<TSource>, 
    Func<TSource, TKey>, 
    IEqualityComparer<TKey>)

ToDictionary<TSource, TKey, TElement>(
    IEnumerable<TSource>, 
    Func<TSource, TKey>, 
    Func<TSource, TElement>)

ToDictionary<TSource, TKey, TElement>(
    IEnumerable<TSource>, 
    Func<TSource, TKey>, 
    Func<TSource, TElement>, 
    IEqualityComparer<TKey>)

您想要第三个,但是由于您调用它并指定了两个泛型类型,因此它实际上使用的是第二个,并且您的第二个参数(实际上是第三个,因为第一个是调用扩展方法的参数)不是 IEqualityComparer<TKey>。修复方法是指定第三个类型。

var dict = tList.ToDictionary<string,string,string>(m => m, c => c);

不要指定通用类型,让编译器通过类型推断来解决

var dict = tList.ToDictionary(m => m, c => c);

如果您希望项目是值,那么您可以直接使用第一个项目,避免使用第二个lambda表达式。

var dict = tList.ToDictionary(c => c);

我很感激这个清晰的解释,让我意识到我可以使用 ToDictionary<string,string,object> 来创建一个 Dictionary<string,object> - RuudvK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接