【问题标题】:Why is my {get; private set} variable returning an empty Dictionary?为什么我的 {get;私有集} 变量返回一个空字典?
【发布时间】:2021-08-06 11:25:23
【问题描述】:

我正在尝试使用 {get; private set;} 用于我现在正在构建的摩尔斯电码翻译器。 MorseToText 字典应该是从我已经定义的 TextToMorse 字典构建的。出于某种原因,当我使用它时,我的字典是空的。

    private static Dictionary<char, string> TextToMorse = new Dictionary<char, string>()
    {
        {'A', ".-" }, {'B', "-..."}, {'C', "-.-."}, {'D', "-.."}, {'E', "."}, {'F', "..-."},
        {'G', "--."}, {'H', "...."}, {'I', ".."}, {'J', ".---"}, {'K', "-.-"}, {'L', ".-.."}, {'M', "--"},
        {'N', "-."}, {'O', "---"}, {'P', ".--."}, {'Q', "--.-"}, {'R', ".-."}, {'S', "..."}, {'T', "-"},
        {'U', "..-"}, {'V', "...-"}, {'W', ".--"}, {'X', "-..-"}, {'Y', "-.--"}, {'Z', "--.." }
    };

    private static Dictionary<string, char> _MorseToText = new Dictionary<string, char>();

    public static Dictionary<string, char> MorseToText
    {
        get { return _MorseToText; }

        private set
        {
            foreach (KeyValuePair<char, string> pair in TextToMorse)
            {
                _MorseToText.Add(pair.Value, pair.Key);
            }
        }
    }

...

        for (int i = 0; i < splitInput.Length; i++)
        {
            MorseToText.TryGetValue(splitInput[i], out char value);
            output += $"{value} ";
        }

【问题讨论】:

  • 你的 getter 返回 _MorseToText 变量,但它只是被初始化为一个空字典并且不再被引用。它总是会返回那个空字典。
  • 在分配属性时使用set 关键字。它不用作初始化方法
  • @Alejandro 直到他们将某些内容设置为 MorseToText,然后它会将 TextToMorse 复制到支持字段 _MorseToText 中,这对于试图将其设置为其他内容的人来说是非常意外的。

标签: c# dictionary morse-code


【解决方案1】:

您永远不会调用您的 setter,因此您的字典永远不会充满值。为了调用设置器,您必须编写例如MorseToText = new Dictionary&lt;string,char&gt;() 或例如MorseToText = null 在您的代码某处。请注意,您输入 setter 的值将被丢弃。如果你调用了 setter 两次,你的代码会抛出一个异常,因为你的字典已经包含了键。这非常令人困惑,因此我建议使用静态构造函数。也许您还想使用只读字典来公开您的字典:

private static Dictionary<char, string> TextToMorse;
private static Dictionary<string, char> _MorseToText;

public static ReadOnlyDictionary<string,char> MorseToText {get; private set; }

static YourClassName()
{
    TextToMorse = new Dictionary<char, string>()
    {
        {'A', ".-" }, {'B', "-..."}, {'C', "-.-."}, {'D', "-.."}, {'E', "."}, {'F', "..-."},
        {'G', "--."}, {'H', "...."}, {'I', ".."}, {'J', ".---"}, {'K', "-.-"}, {'L', ".-.."}, {'M', "--"},
        {'N', "-."}, {'O', "---"}, {'P', ".--."}, {'Q', "--.-"}, {'R', ".-."}, {'S', "..."}, {'T', "-"},
        {'U', "..-"}, {'V', "...-"}, {'W', ".--"}, {'X', "-..-"}, {'Y', "-.--"}, {'Z', "--.." }
    };

    _MorseToText = new Dictionary<string,char>();
    foreach (KeyValuePair<char, string> pair in TextToMorse)
    {
        _MorseToText.Add(pair.Value, pair.Key);
    }
    MorseToText = new ReadOnlyDictionary(_MorseToText);
}

【讨论】:

    【解决方案2】:

    反转Dictionary 的最简单方法之一是使用ToDictionary linq 函数,然后交换KeyValue

    static Dictionary<char, string> TextToMorse = new Dictionary<char, string>()
    {
        {'A', ".-" }, {'B', "-..."}, {'C', "-.-."}, {'D', "-.."}, {'E', "."}, {'F', "..-."},
        {'G', "--."}, {'H', "...."}, {'I', ".."}, {'J', ".---"}, {'K', "-.-"}, {'L', ".-.."}, {'M', "--"},
        {'N', "-."}, {'O', "---"}, {'P', ".--."}, {'Q', "--.-"}, {'R', ".-."}, {'S', "..."}, {'T', "-"},
        {'U', "..-"}, {'V', "...-"}, {'W', ".--"}, {'X', "-..-"}, {'Y', "-.--"}, {'Z', "--.." }
    };
    static Dictionary<string, char> MorseToText = TextToMorse.ToDictionary(x => x.Value, x => x.Key);
    

    目前您使用的 setter 错误。当您为MorseToText 赋值时,将调用 set 函数。例如,当您尝试将 MorseToText 设置为任何实例(例如 MorseToText = null)时,它将运行覆盖您对 setter 代码所期望的默认行为。

    【讨论】:

      猜你喜欢
      • 2020-10-05
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 2021-04-23
      • 2015-11-20
      • 1970-01-01
      相关资源
      最近更新 更多