1

関数「RemoveAll」を使用するのを手伝ってください。そうしないと、別の実装があるはずです。アイテムのリストを含むオブジェクト(サービス)があります。最初のオブジェクトと等しい別のオブジェクト(anotherService)を作成します。

mainService == falseのアイテムを2番目のオブジェクト(anotherService )から削除する必要があります。

「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;

単に新しい変数を定義し、既存の値(ほぼ確実にクラス参照)をその変数に割り当てます。新しいオブジェクトは作成されません。参照へのメンバーアクセスは、使用する変数に関係なく、同じ実際のオブジェクトに移動します(オブジェクトは1つだけです)。

必要なことを行うには、浅いまたは深いクローンを作成する必要があります(正確に何をしたいかによって異なります)。

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 に答える