C# 如何从一个对象(它是另一个对象的副本)中删除多个项目,而不影响其中一个项目的派生?

C# 如何从一个对象(它是另一个对象的副本)中删除多个项目,而不影响其中一个项目的派生?,c#,removeall,C#,Removeall,请帮助我使用函数“RemoveAll”,或者应该有另一个实现。 我有一个对象(服务),其中包含一个包含项目的列表。 我制作了另一个与第一个相等的对象(另一个服务) 我应该从第二个对象(另一个服务)中删除mainService==false的项 我使用“RemoveAll”函数,但在执行此操作后,还会从对象(服务)中删除mainService=false的项。 我需要先完成第一个对象,然后再删除 var services = DictionaryObject.GetDictionaryValida

请帮助我使用函数“RemoveAll”,或者应该有另一个实现。 我有一个对象(服务),其中包含一个包含项目的列表。 我制作了另一个与第一个相等的对象(另一个服务)

我应该从第二个对象(另一个服务)中删除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 services=DictionaryObject.GetDictionaryValidatedByDate(DictionaryType.REF_服务,DateTime.Now);
var anotherService=服务;
另一个服务.RemoveAll(p=>
{                   
if(p.Model.mainService==false)
{
返回true;
}
返回false;
});

谢谢大家。

您的问题是,您正在通过不同的引用更改同一对象。您需要确保从包含相同信息副本的不同对象中删除项目。有几种方法可以做到这一点。最简单的方法是只创建两个对象:

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;
    });
在实现复制对象的
Copy()
方法或构造函数时,需要确保创建字典的副本,而不仅仅是使用对同一字典的引用

如果返回的对象只是一个
IDictionary
(从提供的代码中看不清楚),则可以执行以下操作:

var anotherService = new Dictionary<KeyType,ValueType>(services)
anotherService.RemoveAll(p =>                
{                   
    if (p.Model.mainService == false || p.Model.mainService == true)
    {
       return true;
    }
    return false;
});
var anotherService=新字典(服务)
另一个服务.RemoveAll(p=>
{                   
if(p.Model.mainService==false | | p.Model.mainService==true)
{
返回true;
}
返回false;
});

您的问题是,您正在通过不同的引用更改同一对象。您需要确保从包含相同信息副本的不同对象中删除项目。有几种方法可以做到这一点。最简单的方法是只创建两个对象:

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;
    });
在实现复制对象的
Copy()
方法或构造函数时,需要确保创建字典的副本,而不仅仅是使用对同一字典的引用

如果返回的对象只是一个
IDictionary
(从提供的代码中看不清楚),则可以执行以下操作:

var anotherService = new Dictionary<KeyType,ValueType>(services)
anotherService.RemoveAll(p =>                
{                   
    if (p.Model.mainService == false || p.Model.mainService == true)
    {
       return true;
    }
    return false;
});
var anotherService=新字典(服务)
另一个服务.RemoveAll(p=>
{                   
if(p.Model.mainService==false | | p.Model.mainService==true)
{
返回true;
}
返回false;
});
行:

var anotherService = services;
简单地定义一个新变量,并将现有值(几乎肯定是类引用)分配给该变量;不创建新对象。对引用的任何成员访问都将转到相同的实际对象,无论使用哪个变量(只有一个对象)

要做您需要的事情,您需要创建一个浅克隆或深克隆(具体取决于您希望发生什么)

通过手动添加复制属性的
clone()
方法或类似方法(可能是
ICloneable
),浅层克隆非常容易实现(注意,对于列表,通常会创建具有相同数据的新列表)。深度克隆更为棘手——序列化和反序列化项目是常见的欺骗手段。

行:

var anotherService = services;
简单地定义一个新变量,并将现有值(几乎肯定是类引用)分配给该变量;不创建新对象。对引用的任何成员访问都将转到相同的实际对象,无论使用哪个变量(只有一个对象)

要做您需要的事情,您需要创建一个浅克隆或深克隆(具体取决于您希望发生什么)


通过手动添加复制属性的
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);
 }
}
publicstatict-DeepClone(T-obj)
{
使用(var ms=new MemoryStream())
{
var formatter=新的二进制格式化程序();
序列化(ms,obj);
ms.Position=0;
返回(T)格式化程序。反序列化(ms);
}
}

可以在以下位置找到序列化方法:

我把它贴在这里作为参考

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);
 }
}
publicstatict-DeepClone(T-obj)
{
使用(var ms=new MemoryStream())
{
var formatter=新的二进制格式化程序();
序列化(ms,obj);
ms.Position=0;
返回(T)格式化程序。反序列化(ms);
}
}

作为旁注:您还可以将检查逻辑简化为另一个service.RemoveAll(p=>!p.Model.mainService);如果您能告诉我们使用
服务的类型
而不仅仅是
var
,这可能会有所帮助。我试图使用
服务的类型创建另一个
服务
,但是,这是不可能的,因为
服务的类型
GetDictionaryValidatedByDate
方法运行之后产生结果,和是Web服务中的私有类型:
RefDictionary
,无法访问。请注意:您还可以将检查逻辑简化为另一个服务。RemoveAll(p=>!p.Model.mainService);如果你能告诉我如何使用
服务的类型
而不仅仅是
var
,这可能会有所帮助。我试图使用
服务的类型创建另一个
服务
,但是,这是不可能的,因为
服务的类型
会产生结果