繁体   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