为什么当我更改它的副本时,我的原始哈希集会更改,我该如何避免它

本文关键字:何避免 哈希集 原始 副本 为什么 我的 | 更新日期: 2023-09-27 18:25:35

以下代码的目的是更新数据库中的内容,以匹配用户在我的前端中选择的内容。正确的 Guid 位于会话变量中,_alreadyLinkedContacts包含数据库中已有的用户。

    protected void btnAssignContacts_OnClick(object sender, EventArgs e)
    {
        btnAssignContacts.Enabled = false;
        //Venn diagram:
        //(Only in session --> add(both in session and Database -> keep) Only in database --> remove )
        HashSet<Guid> contactsInSession = (HashSet<Guid>)Session[SelectedContactsSessionVar];
        HashSet<Guid> contactsInDatabase = _alreadyLinkedContacts;
        //Everything that's in the session should go in the database;
        HashSet<Guid> contactsToAdd = contactsInSession;
        //Base the set to remove on that in the database.
        HashSet<Guid> contactsToRemove = contactsInDatabase;
        // We don't need to add those that are in the database already;
        contactsToAdd.RemoveWhere(contactsInDatabase.Contains);
        MarketingDirector.AddContactsToMarketingList(contactsToAdd.ToList(), _marketinglist.Id);
        // Those that are currently in the session don't need to be removed from the database, all the others do.
        contactsToRemove.RemoveWhere(contactsInSession.Contains);
        MarketingDirector.RemoveContactsFromMarketingList(contactsToRemove.ToList(), _marketinglist.Id);
        btnAssignContacts.Text = "Contacts assigned";
    }

过滤contactsToAdd后,contactsInSession也已更改,排除了与我的系统中相同的 guid。因此,它不会从contactsToRemove中删除任何内容,并且会删除数据库中已有的任何内容,而不仅仅是不在会话中的内容。

为什么会发生这种情况,我该如何避免?

为什么当我更改它的副本时,我的原始哈希集会更改,我该如何避免它

正如您在执行以下操作时在评论中所说的那样:

HashSet<Guid> contactsToAdd = contactsInSession;

您正在分配第二个变量来引用与原始变量相同的HashSet。如果您执行以下操作,您将创建一个新HashSet,它是原始副本的副本。

HashSet<Guid> contactsToAdd = new HashSet<Guid>(contactsInSession);

您可能希望对需要 HashSet 副本的所有作业执行相同的操作。

您正在使联系人删除和联系人在会话中指向同一个哈希集。你为什么不希望 contactsToRemove.RemoveWhere(( 影响 contactsInSession HashSet ?我认为您缺少将数据从一个哈希集复制到另一个哈希集的步骤,在您的代码中,您始终复制引用而不是哈希集的内容。

几乎可以肯定的是,这两条线

    //Everything that's in the session should go in the database;
    HashSet<Guid> contactsToAdd = contactsInSession;
    //Base the set to remove on that in the database.
    HashSet<Guid> contactsToRemove = contactsInDatabase;

不正确;它们应该从源哈希集中复制数据,而不是将引用指针复制到该哈希集。通过执行引用复制,您只需声明指向同一哈希集的两个变量 - 通过 contactsToAdd OR contactsInSession 所做的任何更改都将影响相同的哈希集。