【发布时间】:2016-12-09 13:38:08
【问题描述】:
我正在尝试从 findall 或 where 创建一个新列表并修改该新列表而不更改原始列表。从 FindAll 创建 list2 并对 list2 进行更改时,它不应影响 list1。怎么会?
编辑...使用了似乎有效的两个答案的组合。有没有预见到的问题???工作代码编辑 编辑...它不起作用。作为对象属性的类没有复制其数据......有什么想法吗???我不明白为什么只是复制或克隆对于列表来说并不简单。
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; }
}
【问题讨论】:
-
显然,当有一个附加类作为属性之一时,这不起作用。作为单独类的属性不会复制其数据。查看编辑后的代码。
标签: asp.net linq list where findall