2016-08-03 70 views
0

我試圖從findall或where創建一個新列表,並修改該新列表而不更改原始列表。從FindAll創建list2並對list2進行更改時,它不應該影響list1。怎麼來的?asp.net從FindAll或Where修改列表而不修改搜索到的原始列表

編輯...兩個似乎工作的答案組合使用。任何預見的問題?編輯的工作代碼 編輯...它不工作。一個屬於對象屬性的類沒有複製其數據...任何想法?我看不出爲什麼複製或克隆對列表來說不簡單和簡單。

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; } 
} 
+0

顯然,當有另外的類屬性的一個不工作。屬於獨立類的屬性沒有複製其數據。查看編輯的代碼。 – user2828970

回答

0

您可以使用。 AsNoTracking()的情況下,方法實體查詢惠蔭選擇從的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()); 
+0

SampleData類的這個列表是屬性的一小部分。對於一個小班而言,這很容易,但對於一個大班級來說,還有更多的特性。是否有一種更簡單的方法來獲取所有屬性,而不必在選擇中指定每個屬性。所以該項目的所有屬性都被複制過了? – user2828970

0

ShallowCopy是你的朋友。

像這樣在你的SampleData類中定義一個ShallowCopy()方法。

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(); 
    } 

} 

然後填充列表2如下...

List<SampleData> list2 = new List<SampleData>(); 
foreach (SampleData sd in list1.Where(m => m.Number == 1)) 
{ 
    list2.Add(sd.ShallowCopy()); 
} 
+0

因此,我使用了來自shady和gthb7的兩個答案的組合。感謝您的投入。我無法使AsNoTracking方法被識別(嘗試添加System.Data.Entity和EntityFramework的引用,但沒有顯示出來......看起來更容易和更清晰,因此使用了2的組合。想要負責添加並記住添加所有的屬性,以便ShallowCopy是第一個似乎可以工作的好添加。任何可預見的問題????使用的代碼有它的工作我要編輯我的原始文章 – user2828970

+0

*任何可預見的問題?*也許。請注意,MemberwiseClone確實創建了一個淺拷貝,但是如果它包含集合,集合中的項目就不會被複制(它是一個具有相同項目的新集合)。 –