1

请帮助我使用“RemoveAll”功能,或者应该有另一个实现。我有一个包含项目列表的对象( services )。我制作了另一个与第一个相同的对象( 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;
    });

谢谢你们。

4

3 回答 3

2

该行:

var anotherService = services;

只需定义一个新变量并将现有值(几乎可以肯定是类引用)分配给该变量;没有创建新对象。无论您使用哪个变量(只有一个对象),对引用的任何成员访问都将转到同一个实际对象。

要做你需要的,你需要创建一个浅或深的克隆(取决于你到底想要发生什么)。

Clone()通过手动添加复制属性的方法或类似方法(也许是)很容易实现浅克隆ICloneable(注意,在列表的情况下,通常会创建一个具有相同数据的新列表)。深度克隆更棘手 - 一个常见的作弊是序列化和反序列化项目。

于 2011-10-03T14:00:31.107 回答
2

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

作为参考,我在这里发布了它。

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);
 }
}
于 2011-10-03T14:02:48.627 回答
1

您的问题是您正在更改同一个对象,只是通过不同的引用。您需要确保从包含相同信息副本的不同对象中删除项目。有几种方法可以做到这一点。最简单的是只创建 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;
});
于 2011-10-03T13:59:33.143 回答