3

list1 と list2 という 2 つの静的リストがあります。

private static IList<String> list1;
private static IList<String> list2;
list1 = new List<String>() { "v1001", "v1002", "v1003","v1004" };

list1 のアイテムを list2 に転送しようとしています

list2 = list1;

list2 から何かを削除しようとすると、その項目は list1 からも削除されます。

var version = "v1001"
list2.Remove(version);

list1を妨げずにlist2からのみ削除できるということをどのように達成できますか。

4

3 に答える 3

4

あなたの例のリスト 2 とリスト 1 は両方とも、変数 list2 と list1 がそれ​​を指している同じオブジェクトです。使用できます

list2 = new List<string>(list1);

これにより、それらは異なるオブジェクトになります。

于 2013-09-01T05:07:14.383 に答える
3

コピー コンストラクターを使用できます。

list2 = new List<string>(list1);

またはLinqを使用します:

list2 = list1.Select(s => s).ToList();

これは静的に呼び出すこともできます:

list2 = Enumerable<string>.ToList(list1);

注: 他の例は参照用にのみ提供されています。Yuriy の回答で提供されているコピー コンストラクターが最もクリーンな方法です。

于 2013-09-01T05:13:22.713 に答える
1

list2 から削除すると list1 からも削除されるのは、list1 と list2 の両方が参照型であるためです。つまり、list1 と list2 は基本的に、リストがメモリ内のどこかに保存されているということです。= 演算子を使用して list2 を list1 に設定すると、実際には、list2 に「list1 が指しているメモリ内の同じ場所を指します」と指示することになります。これは、参照 list1 を使用して何かを変更すると、この変更が list2 に複製されているように見えることを意味します (ただし、実際には同じデータを変更しているだけです)。これを回避するには、代わりに

list2 = list1;

これを使用できると思います(Yuriy Faktorovichが言ったように):

編集:これを試してください

class Program
{
    private static IList<string> list1 = new List<string>() { "v1001", "v1002", "v1003", "v1004" };
    private static IList<string> list2 = new List<string>(list1);

    static void Main(string[] args)
    {
        list1.Remove("v1001");
        print(list1);
        print(list2);
    }

    private static void print(IList<string> list)
    {
        foreach (string str in list)
        {
            Console.WriteLine(str);
        }
        Console.WriteLine();
    }
}
于 2013-09-01T05:25:30.353 に答える