asp.net Изменить список из FindAll или Где без изменения исходного списка поиска

Я пытаюсь создать новый список из findall или где и изменить этот новый список, не внося изменений в оригинал. При создании списка2 из FindAll и внесении изменений в список2 это не должно влиять на список1. Почему?

Изменить... Используется комбинация обоих ответов, которая, похоже, работает. Любые предвидимые проблемы??? Рабочий код отредактирован Изменить... Не работает. Класс, который является свойством объекта, не копирует свои данные... Любые идеи??? Я не понимаю, почему простое копирование или клонирование не является простым и простым для списка.

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Started");
        List<SampleData> list1 = SampleData.MakeList(3);
        for (int i = 0; i < list1.Count; i++)
        {
            Console.WriteLine("list1.Number => " + list1[i].Number);
            Console.WriteLine("list1.Person => " + list1[i].Person);
        }
        List<SampleData> list2 = new List<SampleData>(list1.FindAll(m => m.Number == 1).Select(x => new SampleData().ShallowCopy())).ToList();
        for (int i = 0; i < list2.Count; i++)
        {
            list2[i].Person = "Person " + list2[i].Number;
            Console.WriteLine("list2.Number => " + list2[i].Number);
            Console.WriteLine("list2.Person => " + list2[i].Person);
        }

        SampleData sd = list2.Find(s => s.Number == 1);
        Console.WriteLine("Apartment Number" + sd.apartment.BuildingLetter); // <<<<------------------- THROWING NULL EXCEPTION FOR APARTMENT

        Console.WriteLine("-------AFTER MODIFYING NEW LIST----LIST1.Person SHOULD BE NULL---");
        for (int i = 0; i < list1.Count; i++)
        {
            Console.WriteLine("--list1.Number => " + list1[i].Number);
            Console.WriteLine("--list1.Person => " + list1[i].Person);
        }
        for (int i = 0; i < list2.Count; i++)
        {
            Console.WriteLine("--list2.Number => " + list2[i].Number);
            Console.WriteLine("--list2.Person => " + list2[i].Person);
        }
        Console.ReadLine();
        System.Environment.Exit(0);
    }

}
class SampleData
{      
    public int Number { get; set; }
    public String Person { get; set; }
    public Apartment apartment { get; set; }
    public static List<SampleData> MakeList(int count)
    {
        List<SampleData> l = new List<SampleData>();
        for (int i = 0; i < count; i++)
        {
            SampleData d = new SampleData();
            d.apartment = new Apartment { RoomNumber = i, BuildingLetter = "letter-" + i };
            d.Number = i;
            l.Add(d);
        }
        return l;
    }
    public SampleData ShallowCopy()
    {
        return (SampleData)this.MemberwiseClone();
    }

}
class Apartment
{
    public int RoomNumber { get; set; }
    public String BuildingLetter { get; set; }
}

person user2828970    schedule 03.08.2016    source источник
comment
По-видимому, это не работает, когда в качестве одного из свойств есть дополнительный класс. Данные свойства, являющегося отдельным классом, не копируются. См. отредактированный код.   -  person user2828970    schedule 04.08.2016


Ответы (2)


Вы можете использовать . Метод AsNoTracking() в случае Entity Query при выборе из DbContext или ObjectContext

List<SampleData> list2 = new List<SampleData>(list1.Where(m => m.Number == 1).AsNoTracking().ToList());

или используйте такой подрядчик копирования

class SampleData
{
    public int Number { get; set; }
    public String Person { get; set; }

    public SampleData(SampleData obj)
    {
        This.Number=obj.Number;
        This.Person=obj.Person;
        ..
        ..
    }
    public static List<SampleData> MakeList(int count)
    {
        List<SampleData> l = new List<SampleData>();
        for (int i = 0; i < count; i++)
        {
            SampleData d = new SampleData();
            d.Number = i;
            l.Add(d);
        }
        return l;
    }
}

затем

 List<SampleData> list2 = new List<SampleData>(list1.Where(m => m.Number == 1).Select(x=>new SampleData(x)).ToList());
person shady youssery    schedule 03.08.2016
comment
Этот список класса SampleData представляет собой очень небольшой класс свойств. Это достаточно просто для небольшого класса, но для большого класса свойств гораздо больше. Есть ли более простой способ получить все свойства, не указывая каждое из них в select. Итак, все свойства этого элемента копируются? - person user2828970; 03.08.2016

ShallowCopy — ваш друг.

Определите метод ShallowCopy() в вашем классе SampleData следующим образом.

class SampleData
{
    public int Number { get; set; }
    public String Person { get; set; }
    public static List<SampleData> MakeList(int count)
    {
        List<SampleData> l = new List<SampleData>();
        for (int i = 0; i < count; i++)
        {
            SampleData d = new SampleData();
            d.Number = i;
            l.Add(d);
        }
        return l;
    }

    public SampleData ShallowCopy()
    {
        return (SampleData)this.MemberwiseClone();
    }

}

Затем заполните list2 следующим образом...

List<SampleData> list2 = new List<SampleData>();
foreach (SampleData sd in list1.Where(m => m.Number == 1))
{
    list2.Add(sd.ShallowCopy());
}
person gthb7    schedule 03.08.2016
comment
Поэтому я использовал комбинацию обоих ответов от shady и gthb7. Спасибо за оба вклада. Я не мог распознать метод AsNoTracking (пытался добавить ссылки для System.Data.Entity и EntityFramework, но не появился... что выглядело намного проще и чище. Поэтому использовал комбинацию из 2. Я не хочу нести ответственность за добавление и не забудьте добавить все свойства, чтобы ShallowCopy был хорошим дополнением к первому, который, кажется, работает Любые предвиденные проблемы???? Используемый код, который работает, я собираюсь отредактировать свой исходный пост - person user2828970; 04.08.2016
comment
Предвидятся проблемы? Возможно. Обратите внимание, что MemberwiseClone создает поверхностную копию, но если она содержит коллекции, элементы в коллекциях не копируются (это новая коллекция с теми же элементами). - person Gert Arnold; 04.08.2016