C# 列表中不需要的重写数据

C# 列表中不需要的重写数据,c#,list,collections,reference,generics,C#,List,Collections,Reference,Generics,我在列表集合中存储数据时遇到问题。若我添加新数据,它会重写旧数据,列表中仍然只有一项 这里是main方法,从这个方法我称为方法OpenChatScreen,它是ChatScreenManager类的方法,其中是problen的根 private void OpenTabChatWindow(string nick) { try { new System.Threading.Tasks.Task(() =>

我在列表集合中存储数据时遇到问题。若我添加新数据,它会重写旧数据,列表中仍然只有一项

这里是main方法,从这个方法我称为方法OpenChatScreen,它是ChatScreenManager类的方法,其中是problen的根

    private void OpenTabChatWindow(string nick)
    {
        try
        {
            new System.Threading.Tasks.Task(() =>
            {
                IDetailData oponent = new DetailData();

                oponent = Service.DetailData(Account, nick);

                Execute.OnUIThread((System.Action)(() =>
                {
                    //here I call problem method OpenChatScreen method where is the problem,
                    //it use still the same reference on object opponent
                    if (ChatScreenManager.OpenChatScreen(true, Account, oponent, Account.DetailData.Info.Nick))
                    {
                        AddConversationHistory(nick);
                    }

                }));
            }

            ).Start();
        }
        catch (Exception exception)
        {
            MsgBox.ShowException(exception);
        }
    }   
ChatScreenManager类中的代码:

             public IDictionary<string,object> ActiveChatScreens { get; set; }

or 
             public IList<string,> ActiveChatScreens { get; set; }
所以我从方法OpenTabChatWindow传递DetailData的对象类型,并将som字符串属性存储在另一个类的List中,但在该对象上使用相同的引用并重写List中的数据

我尝试创建对象的新图标:

                IDetailData oponent = new DetailData();

                oponent = Service.DetailData(Account, nick);

并将此对象传递给问题方法,但它没有解决它

现在,如果我理解你的例子

将对象添加到ActiveChatScreens

可能是您首先在调用OpenChatScreen时重用了相同的对象

那么在调用这些方法之前,对手会改变,对它的任何引用也会改变


请记住,对象是引用结构,即使更改其中的数据,引用仍然是相同的。

ActiveChatScreens是什么数据类型?对不起,我错了,我编辑了我的问题。它是列表,也可以是字典。问题与我将opporter.Info.Nick存储到collection相同。但它对对象对象使用相同的引用,并重写列表中的项。如果在字典中使用相同的引用,则应重写以前的内容。如果您试图添加新消息,则需要使用messageid作为密钥,并且在其包含的对象中具有who和what属性。是这种情况,还是您正在尝试打开新的聊天窗口,然后它为什么会被覆盖?不是。我使用收集字典或列表检查带有某个id的屏幕是否处于活动状态。我添加了新的object instance,请参见OpenTabChat method=>IDetailData opont=new DetailData;,对象opponet具有字符串属性Nick,Nick是字典中的键。所以我添加了密钥对值Tom,object,然后是Mike,object,这是在字典中重写的Tom,object。因为此操作仅在字典中对Mike,object。我知道我的英语很糟糕,你现在明白我的意思了吗?是的,你有权聊天ShellViewModel类是singleton->it case这个问题。非常感谢。
                IDetailData oponent = new DetailData();

                oponent = Service.DetailData(Account, nick);