为了账号安全,请及时绑定邮箱和手机立即绑定

元组值返回 null 的字典?

元组值返回 null 的字典?

C#
萧十郎 2023-07-22 17:02:59
我有一个类,其中的字典定义为私有成员:    Dictionary<int, (string, string)> arenaIdToSetAndNumber = new Dictionary<int, (string, string)>()     {         { 70506, ("c16", "337") },         { 70507, ("c16", "340") },         { 70508, ("c16", "343") },         { 70509, ("c16", "346") },         { 70510, ("c16", "349") },     };在调试时,我找到了与 key 相对应的项目70506,我用 2 个手表看到了这一点:我尝试这样做var test = arenaIdToSetAndNumber[c.grpId].Item1,并将test其设置为 null与第二块手表中看到的一样!我不明白为什么
查看完整描述

2 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

调试器和观察器无法从索引器运算符 [] 推断 Item1 是什么,因此在观察器中将为您提供 null。但是一旦你运行代码,它就可以很好地用于阅读目的。为了写作目的,您需要取出整个元组,对其进行编辑并重新插入字典中:

static void Main(string[] args)
    {
        Dictionary<int, (string, string)> arenaIdToSetAndNumber = new Dictionary<int, (string, string)>()
        {
            { 70506, ("c16", "337") },
            { 70507, ("c16", "340") },
            { 70508, ("c16", "343") },
            { 70509, ("c16", "346") },
            { 70510, ("c16", "349") },
        };        var myTuple = arenaIdToSetAndNumber[70509];
        myTuple.Item1 = "c18";
        arenaIdToSetAndNumber[70509] = myTuple;
                //System.Console.WriteLine(arenaIdToSetAndNumber[70509].Item1); // This prints c18
    }

否则,在一行中,只需重新创建整个元组:

arenaIdToSetAndNumber[70509] = ("c18", arenaIdToSetAndNumber[70509].Item2);

所有这一切都是因为 ValueTuple 是一个结构。


查看完整回答
反对 回复 2023-07-22
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

这不使用元组,但解决了您的问题。由于您想要读取值,请创建一个不可变的类,因此请使用属性来检索值。


public class Contents

{

    private readonly string leftValue;

    private readonly string rightValue;


    public Contents(string aLeftValue, string aRightValue)

    {

        leftValue = aLeftValue;

        rightValue = aRightValue;

    }


    public string LeftValue => leftValue;

    public string RightValue => rightValue;       

}

修改您的代码以使用新类。


 Dictionary<int, Contents> arenaIdToSetAndNumber = new Dictionary<int, Contents>()

        {

            { 70506, new Contents("c16", "337") },

            { 70507, new Contents("c16", "340") },

            { 70508, new Contents("c16", "343") },

            { 70509, new Contents("c16", "346") },

            { 70510, new Contents("c16", "349") },

        };

你可以用这个来测试它。


  var content = arenaIdToSetAndNumber[70506];

  string leftValue = content.LeftValue;

  string rightValue = content.RightValue;

希望这能解决您的问题。


查看完整回答
反对 回复 2023-07-22
  • 2 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信