使用.ToDictionary()

时间:2010-08-31 16:31:56

标签: c# generics

我有一个返回List的方法,我们称之为GetSomeStrings()

我在字符串类上有一个扩展方法,返回字符串中的字符数,例如。 myString.Number('A')

我想在一行中抓一本字典。字典的条目包含字符串,以及字符串中所选字符的编号。

其实我会做以下事情:

var myDic = GetSomeStrings().ToDictionary(x=>x.Number('A'));

给了我一本字典<int,string>;我希望密钥作为字符串。

之后,我想在int值上订购字典。可以在前面的陈述中包括这个吗?

我真的想避免使用集合枚举来从列表中排序或创建字典,这实际上没有麻烦。感谢您的优化帮助!

7 个答案:

答案 0 :(得分:74)

修改

ToDictionary()方法有an overload that takes two lambda expressions (nitpick:delegates);一个用于密钥,一个用于值。

例如:

var myDic = GetSomeStrings().ToDictionary(x => x, x => x.Number('A'));

请注意,GetSomeStrings()返回的值必须是唯一的。


.Net的Dictionary<TKey, TValue>是无序的;它根本无法排序。

相反,您可以在使用时对字典进行排序,如下所示:

foreach(KeyValuePair<string, int> kvp in dict.OrderBy(kvp => kvp.Value))

答案 1 :(得分:7)

常规字典未排序,但您可以使用SortedDictionary:

var sortedDict = new SortedDictionary<string, int>(
    GetSomeStrings().ToDictionary(x => x, y => y.Number('A')));

该语句应该为您提供按字符串键排序的SortedDictionary。

答案 2 :(得分:5)

如果我理解正确的问题,这是我的解决方案:

var myDic = GetSomeStrings()
.Select(x => new KeyValuePair<string, int>(x, x.Number('A')))
.ToDictionary(t => t.Key, t => t.Value);

答案 3 :(得分:2)

要构建字典,您可以这样做:

var strings = new[] { "one", "2", "three", "four", "five", "six", "seven", "eight", "nine", "ten" };
var dictionary = strings.GroupBy(x => x.Length.ToString()).ToDictionary(x => x.Key, x => x);

注意“ToString()”用法将字符串的长度转换为字符串。

此外,排序字典通常没有意义。您可以对字典的每个键中的项进行排序,也可以在要循环时对字典的键进行排序。

var sortedKeys = dictionary.Keys.OrderBy(x => x);
var sortedValues = dictionary["1"].OrderBy(x => x);

答案 4 :(得分:1)

你需要使用ToDictionary的重载,它带有两个函数:

 var myDic = GetSomeStrings().ToDictionnary(x => x, x => x.Number('A'));

这两个函数都使用您用于创建字典的对象。第一个产生密钥;第二,价值。

答案 5 :(得分:1)

var myDic = GetSomeStrings()
    .ToDictionary(x => x, x => x.Number('A'));

以您想要的方式获取字典。

编辑:添加了排序依据。首先命令字符串,然后将它们放入字典中,如你所愿

Edit2:Slaks是对的。 OrderBy没有效果。再次删除

答案 6 :(得分:0)

var users = this.context.ad_user.ToDictionary(v => v.DistinguishedName,
v => new ad_user
{
     DistinguishedName = v.DistinguishedName,
     CN = v.CN,
     DisplayName = v.DisplayName,
     Info = v.Info,
     Mail = v.Mail
 });