仅在Visual Studio中的调试器中对键上的字典进行排序

时间:2019-05-10 09:10:44

标签: c# dictionary debugging

我在应用程序中使用了基于Dictionary的对象。 调试时(并且仅当我检查字典时),我想浏览字典的内容,但按键排序。

我知道我可以使用SortedDictionary代替Dictionary,但是与Dictionary相比,它的性能很差,并且我不想影响性能。

我也不想出现“ #if debug”条件。

有可能吗?

3 个答案:

答案 0 :(得分:2)

您可以在类上指定{/ {3}},以便在调试时使用。该代理必须为您排序数据。

文章:DebuggerTypeProxyAttribute()

使用Dictionary<string,int>的(无意义)子级的示例:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

internal class Program
{
    /// <summary>
    /// Derives from a Dictionary that is not sorted
    /// </summary>
    [DebuggerTypeProxy(typeof(DictDebugView))]
    public class MyDictionary : Dictionary<string, int>
    {
        /// <summary>
        /// Prepares unsorted dummy data
        /// </summary>
        public void PopulateDemoData()
        {
            foreach (char t in "GERZWIQSFHIWE")
               this[new string(t, t / 10)] = t;
        }

        /// <summary>
        /// Is used as proxy for display
        /// </summary>
        internal class DictDebugView
        {
            private readonly SortedDictionary<string, int> sorted;
            public DictDebugView(Dictionary<string, int> data)
                => sorted = new SortedDictionary<string, int>(data);

            /// <summary>
            /// Create the displayed KeyValuePairs
            /// </summary>
            [DebuggerBrowsable(DebuggerBrowsableState.Collapsed)]
            public IList<KeyValuePair<string,int>> Keys
            {
                get => sorted.Select(kvp => kvp).ToList();
            }
        }
    } 

    public static MyDictionary MyProp { get; } = new MyDictionary();

    public static void Main(string[] args)
    {
        var md = new MyDictionary();
        md.PopulateDemoData();

        var k = new Dictionary<string,int>(md); 

        Console.ReadLine();
    } 
}

如果放置断点并进行调试,则将使用内部DebuggerTypeProxy获得类的排序输出:

Enhancing Debugging with the Debugger Display Attributes

和不使用任何代理显示其数据的“普通”字典的未排序输出:

Using the DebuggerTypeProxy

答案 1 :(得分:0)

在手表中使用它:

new SortedDictionary<string,object>(dictionary)

或带有Debug方法的方法,该方法返回sortedDictionary

答案 2 :(得分:-1)

尝试在调试过程中注意以下代码,您会发现所需的结果。

l_oDictionary.OrderBy(key => key.Key);