【问题标题】:Using .ToDictionary()使用 .ToDictionary()
【发布时间】:2010-08-31 16:31:55
【问题描述】:

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

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

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

其实我是这样做的:

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

这给了我一本字典<int,string>;我想把钥匙当作字符串。

之后,我想根据 int 值订购字典。可以在前面的语句中包含这个吗?

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

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    编辑

    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))
    

    【讨论】:

    • 谢谢,我的主要问题是 lambda 返回 我想要 的地方。有什么想法吗?
    • 将值转换为您想要的任何类型。 IE。 x.ToString()、Convert.ToInt32()。
    • "请注意,GetSomeStrings() 返回的值必须是唯一的。"这让我绊倒了几次。如果需要,您可以通过在 .ToDictionary 调用之前添加 .Distinct().DistinctBy() 来确保它们是唯一的。
    【解决方案2】:

    普通字典没有排序,但您可以使用 SortedDictionary:

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

    这应该会给你一个 SortedDictionary 按字符串键排序的。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        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);
        

        【讨论】:

          【解决方案5】:
          var myDic = GetSomeStrings()
              .ToDictionary(x => x, x => x.Number('A'));
          

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

          编辑:添加了排序依据。首先对字符串进行排序,然后按照您的喜好将它们放入字典中

          Edit2: Slaks 是对的。 OrderBy 无效。又删了

          【讨论】:

          • 字典本质上是无序的。您的OrderBy 呼叫将无效。
          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:
            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
             });
            

            【讨论】:

            • 如果您提供解释为什么这是首选解决方案并解释它是如何工作的,它会更有帮助。我们想要教育,而不仅仅是提供代码。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-09-06
            • 1970-01-01
            • 2010-09-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多