Сортировать словарь по ключу только в отладчике в VisualStudio - PullRequest
2 голосов
/ 10 мая 2019

Я использую объект на основе словаря в моем приложении.При отладке (и только когда я проверяю словарь) я хотел бы просмотреть содержимое словаря, но отсортировать по ключу.

Я знаю, что мог бы использовать SortedDictionary вместо словаря, но производительность низкая по сравнению со словареми я не хочу влиять на производительность.

Я тоже не хочу иметь условие "#if debug".

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 10 мая 2019

Вы можете указать 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:

Using the DebuggerTypeProxy

и несортированный вывод для «обычного» словаря, который не использует прокси для отображения своих данных:

as plain dict

0 голосов
/ 10 мая 2019

Использование этого в watch:

new SortedDictionary<string,object>(dictionary)

или метод Debug с этим возвращают sortedDictionary

0 голосов
/ 10 мая 2019

Попробуйте поставить следующую строчку кода во время отладки, вы найдете желаемый результат.

l_oDictionary.OrderBy(key => key.Key);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...