【问题标题】:Convert dictionary values into array将字典值转换为数组
【发布时间】:2010-09-16 20:36:49
【问题描述】:

将字典的值列表转换为数组的最有效方法是什么?

例如,如果我有一个Dictionary,其中KeyStringValueFoo,我想得到Foo[]

我正在使用 VS 2005,C# 2.0

【问题讨论】:

    标签: c# .net arrays generics dictionary


    【解决方案1】:
    // dict is Dictionary<string, Foo>
    
    Foo[] foos = new Foo[dict.Count];
    dict.Values.CopyTo(foos, 0);
    
    // or in C# 3.0:
    var foos = dict.Values.ToArray();
    

    【讨论】:

    • 扩展 .ToArray() 性能更好吗?
    • 但是我们怎么知道它是最有效的呢?
    • @Tom 我通常认为框架中内置的任何内容(如 .CopyTo() 或 .ToArray())都是最有效的方法。微软人比我聪明。 :)
    • ToArray 的性能不如 CopyTo(它使用 CopyTo 复制到内部中间表示,然后再次 Copy 将其返回)。但是,与所有与微观性能相关的问题一样,要考虑可读性、稳健性和可维护性,并在出现问题时衡量性能。
    • ToArray() 是LINQ中的扩展方法,所以需要加上using System.Linq;
    【解决方案2】:

    将其存储在列表中。比较容易;

    List<Foo> arr = new List<Foo>(dict.Values);
    

    当然,如果你特别想要它在一个数组中;

    Foo[] arr = (new List<Foo>(dict.Values)).ToArray();
    

    【讨论】:

      【解决方案3】:

      Values 上有一个 ToArray() 函数:

      Foo[] arr = new Foo[dict.Count];    
      dict.Values.CopyTo(arr, 0);
      

      但我认为它效率不高(我还没有真正尝试过,但我猜它会将所有这些值复制到数组中)。你真的需要一个数组吗?如果没有,我会尝试通过 IEnumerable:

      IEnumerable<Foo> foos = dict.Values;
      

      【讨论】:

        【解决方案4】:

        如果您想使用 linq,那么您可以尝试以下操作:

        Dictionary<string, object> dict = new Dictionary<string, object>();
        var arr = dict.Select(z => z.Value).ToArray();
        

        我不知道哪个更快或更好。两者都对我有用。

        【讨论】:

        • dict.Values.ToArray() 做同样的事情,但没有通过委托实现每个值的开销。
        【解决方案5】:

        如今,一旦有了 LINQ,就可以将字典键及其值转换为单个字符串。

        您可以使用以下代码:

        // convert the dictionary to an array of strings
        string[] strArray = dict.Select(x => ("Key: " + x.Key + ", Value: " + x.Value)).ToArray();
        
        // convert a string array to a single string
        string result = String.Join(", ", strArray);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-25
          • 1970-01-01
          • 1970-01-01
          • 2017-07-21
          • 2021-08-10
          • 1970-01-01
          • 1970-01-01
          • 2018-05-28
          相关资源
          最近更新 更多