簡體   English   中英

如何從一個對象(另一個對象的副本)中刪除多個項目,而又不影響其中一個派生對象?

[英]How can I delete several items from an object, which is copy of another object, without affecting the one of which is derived?

請幫我使用功能“ RemoveAll”,否則可能應該有另一個實現。 我有一個對象( 服務 ),其中包含帶有項目的列表。 我創建另一個對象( anotherService ),該對象與第一個對象相等。

我應該從第二個對象( anotherService )中刪除具有mainService == false的項目。

我使用“ RemoveAll”功能,但是在執行此操作后,還將從對象( 服務 )中刪除mainService = false的項目。 我需要先刪除第一個對象,然后再完成操作。

var services = DictionaryObject.GetDictionaryValidatedByDate<ServiceInfo>(DictionaryType.REF_SERVICE, DateTime.Now);

var anotherService = services;

anotherService.RemoveAll(p =>                
    {                   
        if (p.Model.mainService == false)
        {
           return true;
        }
        return false;
    });

謝謝你們。

該行:

var anotherService = services;

只需定義一個新變量並將現有值(幾乎可以肯定是類引用)分配給該變量; 沒有創建新對象。 無論您使用哪個變量(只有一個對象),對引用的任何成員訪問都將轉到相同的實際對象。

要做到你需要什么,你需要(這依賴你想發生什么)創建一個淺或深克隆。

通過手動添加Clone()屬性的Clone()方法或類似方法(可能是ICloneable ),淺克隆很容易實現(請注意,在使用列表的情況下,通常會創建具有相同數據的列表)。 深度克隆比較棘手-序列化和反序列化項是一個常見的作弊行為。

可以在此答案中找到序列化方法:

供參考,我已經在這里發布了。

public static T DeepClone<T>(T obj)
{
 using (var ms = new MemoryStream())
 {
   var formatter = new BinaryFormatter();
   formatter.Serialize(ms, obj);
   ms.Position = 0;

   return (T) formatter.Deserialize(ms);
 }
}

您的問題是您只是通過不同的引用來更改同一對象。 您需要確保從另一個對象中刪除項目,該對象包含相同信息的副本。 有幾種方法可以做到這一點。 最簡單的是只創建2個對象:

var services = DictionaryObject.GetDictionaryValidatedByDate<ServiceInfo>(DictionaryType.REF_SERVICE, DateTime.Now);

var anotherService =  DictionaryObject.GetDictionaryValidatedByDate<ServiceInfo>(DictionaryType.REF_SERVICE, DateTime.Now);;

anotherService.RemoveAll(p =>                
    {                   
        if (p.Model.mainService == false || p.Model.mainService == true)
        {
           return true;
        }
        return false;
    });

或者您可以復制/克隆對象,例如:

var anotherService = services.Copy(); //or maybe use a copy constructor here instead:
//  var anotherService = new ServiceInfo(sevices);
anotherService.RemoveAll(p =>                
{                   
    if (p.Model.mainService == false || p.Model.mainService == true)
    {
       return true;
    }
    return false;
});

當實現Copy()方法或將對象復制的構造函數時,您需要確保創建字典的副本,而不僅僅是使用對同一字典的引用。

如果返回的對象只是一個IDictionary<K,V> (從提供的代碼中不清楚),則可以執行以下操作:

var anotherService = new Dictionary<KeyType,ValueType>(services)
anotherService.RemoveAll(p =>                
{                   
    if (p.Model.mainService == false || p.Model.mainService == true)
    {
       return true;
    }
    return false;
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM