【问题标题】:Debug display multidimensional arrays in user-friendly format以用户友好的格式调试显示多维数组
【发布时间】:2019-12-08 12:58:16
【问题描述】:

我在 C# 中有一个二维数组的特定签名:

/// <summary>
/// Neurons array
/// <para>[0,:] == Neuron id</para>
/// <para>[1,:] == Type (1 - input, 2 - output, 3 - hidden)</para>
/// <para>[2,:] == Activation function</para>
/// </summary>
public int[,] Neurons { get; private set; }

所以,如果我通过 Visual Studio 查看这个属性,我会看到类似:

我想以用户友好的格式显示此属性。像这样的:

我可以实现这种行为吗?怎么做?

附注最终目标是让调试多维数组更容易。

【问题讨论】:

  • 您可以使用这样的自定义类型列表:List&lt;Neuron&gt;
  • @Hadi,感谢您的回复,但出于性能原因,我需要使用多维数组
  • 那么用户友好格式的使用在哪里??
  • @Hadi,关于在这种特定情况下以用户友好模式显示多维数组的问题。不是关于如何制作易于使用的结构。

标签: c# arrays visual-studio debugging multidimensional-array


【解决方案1】:

嗯,这有点麻烦,但如果你认为它会让事情变得更容易,那就值得了。解决方案取决于创建DebuggerViewDebuggerTypeProxy。我们将使用代理来格式化我们的数据。和 DebuggerView 来显示格式化数据。

        [DebuggerDisplay("Id:{Id} | Type:{Type} | Act:{Act}")] // format properties as you like
        public class TypeContainer
        {
            public int Id { get; set; }

            public int Type { get; set; }

            public int Act { get; set; }
        }

        [DebuggerDisplay("{DebuggerDisplay,nq}")]
        [DebuggerTypeProxy(typeof(FakeNeuronDebugView))] // specify a proxy 
        public class MyFakeNeuron
        {

            public MyFakeNeuron()
            {
                this.Neurons = new int[10, 10];
            }

            public int[,] Neurons { get; set; }

            private string DebuggerDisplay => "Count = " + this.Neurons.Length;

            private class FakeNeuronDebugView
            {
                private readonly MyFakeNeuron myFakeNeuron;
                public FakeNeuronDebugView(MyFakeNeuron myFakeNeuron)
                {
                    this.myFakeNeuron = myFakeNeuron;
                }

                [DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
                public TypeContainer[] Values
                {
                    get
                    {
                        var keys = new List<TypeContainer>();
                        var source = this.myFakeNeuron.Neurons;
                        for (int j = 0; j < source.GetLength(0); j++)
                        {
                            var key = new TypeContainer
                            {
                                Id = source[0, j],
                                Type = source[1, j],
                                Act = source[2, j],
                            };
                            keys.Add(key);
                        }

                        return keys.ToArray();
                    }
                }
            }
        }

进一步阅读:Documentation

【讨论】:

  • 绝对是我需要的。这是一个有点复杂的解决方案,但它非常灵活。谢谢你,@Eldar
【解决方案2】:

您可以使用 Visual Studio 扩展来改善您收集的数组体验。 Array Visualizer

【讨论】:

  • 不幸的是,此扩展仅适用于 Visual Studio 2010、2012、2013、2015。不支持 VS 2017 或 2019。目前在市场上看不到最新 VS 版本的免费扩展。
  • 我想还没有人测试过,总是值得一试。
  • 现在尝试安装它。 Vsix 安装程序在最新的 VS 2019 (16.4.0) 上抛出错误。
猜你喜欢
  • 2017-08-24
  • 2022-07-12
  • 1970-01-01
  • 2023-03-22
  • 2014-11-02
  • 2012-09-24
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多