我在应用程序中使用了基于Dictionary的对象。 调试时(并且仅当我检查字典时),我想浏览字典的内容,但按键排序。
我知道我可以使用SortedDictionary代替Dictionary,但是与Dictionary相比,它的性能很差,并且我不想影响性能。
我也不想出现“ #if debug”条件。
有可能吗?
答案 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
和不使用任何代理显示其数据的“普通”字典的未排序输出:
答案 1 :(得分:0)
在手表中使用它:
new SortedDictionary<string,object>(dictionary)
或带有Debug方法的方法,该方法返回sortedDictionary
答案 2 :(得分:-1)
尝试在调试过程中注意以下代码,您会发现所需的结果。
l_oDictionary.OrderBy(key => key.Key);