Yo uso un objeto basado en Diccionario en mi aplicación. Al depurar (y solo cuando inspecciono el Diccionario) me gustaría ver el contenido del diccionario pero ordenado por clave.

Sé que podría usar SortedDictionary en lugar de Dictionary, pero el rendimiento es pobre en comparación con Dictionary y no quiero afectar el rendimiento.

No quiero tener una condición de "#if depuración" tampoco.

¿Es posible?

2
Whiletrue 10 may. 2019 a las 12:10

3 respuestas

La mejor respuesta

Puede especificar un DebuggerTypeProxyAttribute () en tu clase que se usa cuando / si depuras. Este proxy tiene que ordenar los datos por usted.

Artículo: Mejora de la depuración con los atributos de visualización del depurador

Ejemplo usando una hija (sin sentido) de un 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();
    } 
}

Si coloca un punto de interrupción y depuración, obtiene una salida ordenada para su clase con DebuggerTypeProxy interno:

Using the DebuggerTypeProxy

Y salida sin clasificar para el diccionario "normal" que no utiliza ningún proxy para mostrar sus datos:

as plain dict

2
Patrick Artner 10 may. 2019 a las 15:14

Intente poner en observación la siguiente línea de código durante la depuración, encontrará el resultado deseado.

l_oDictionary.OrderBy(key => key.Key);
-1
Vashdev Heerani 10 may. 2019 a las 11:59

Usando esto en el reloj:

new SortedDictionary<string,object>(dictionary)

O un método de depuración con ese retorno de sortedDictionary

0
Whiletrue 10 may. 2019 a las 12:41