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?
3 respuestas
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:
Y salida sin clasificar para el diccionario "normal" que no utiliza ningún proxy para mostrar sus datos:
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);
Usando esto en el reloj:
new SortedDictionary<string,object>(dictionary)
O un método de depuración con ese retorno de sortedDictionary
Preguntas relacionadas
Nuevas preguntas
c#
C # (pronunciado "see sharp") es un lenguaje de programación multi-paradigma de alto nivel, estáticamente tipado desarrollado por Microsoft. El código C # generalmente se dirige a la familia de herramientas y tiempos de ejecución .NET de Microsoft, que incluyen .NET Framework, .NET Core y Xamarin, entre otros. Use esta etiqueta para preguntas sobre el código escrito en las especificaciones formales de C # o C #.