2011-03-08 6 views
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Comparer.csd 
{ 
    class Program 
    { 
     /* Confusion is regarding how ToList() method works. Does it do the deep copy or shallow copy?? 

     /**********OUTPUT 
     a a b 
     a b c 
     a c a 
     ----------------- 
     a a b 
     a c a 
     ----------------- 
     1 
     2 
     3 
     OUTPUT ENDS************/ 

     static void Main(string[] args) 
     { 
      List<test> list = new List<test>(); 
      list.Add(new test("a", "b", "c")); 
      list.Add(new test("a", "c", "a")); 
      list.Add(new test("a", "a", "b")); 

      /// sort the list based on first name and last name 

      IEnumerable<test> soretedCollection = from t in list 
            orderby t._fname ascending, t._mname ascending 
            select t; 
      Print(soretedCollection); 
      /// remove the first object from the list 
      list.RemoveAt(0); 
      /// print the list . 
      /// Removal of the item from the list is reflected here so I guess sorted collection and list both 
      /// are refering the same data structure 
      /// what if I will do 
      /// list = soretedCollection.ToList<test>(); /// is it going to change the reference of the list if some other object 
      /// is holding the reference?? 
      Print(soretedCollection); 

      Dictionary<int, int> dic = new Dictionary<int, int>();    
      dic.Add(1, 1); 
      dic.Add(2, 1); 
      dic.Add(3, 1); 
      List<int> keys = dic.Keys.ToList<int>(); 
      /// remove the dictionary entry with key=2 
      dic.Remove(2); 
      /// how come this time it did not remove the second item becuase it is removed from the dictionary. 
      for (int i = 0; i < keys.Count; ++i) 
      { 
       Console.WriteLine(keys[i].ToString()); 
      } 

      Console.Read(); 
     } 

     static void Print(IEnumerable<test> list) 
     { 
      foreach (test t in list) 
      { 
       t.Print(); 
      } 
      Console.WriteLine("---------------------"); 
     } 
    } 

} 

답변

4

. 이 목록의 실제 항목은 @Johannes Rudolph가 지적한 것과 같은 원래의 열거 형과 동일한 (동일한 객체 참조) - 그래서 그렇습니다 그것은 얕은 사본입니다.

IEnumerable<test> 생각됩니다 유유히 소스 모음을 통해 실행 - 만이 적극적으로 그 시점에서와 같이 열거 소스 수집을 취하는 열거를 생성합니다 (foreach 또는 .ToList()를 사용하여 즉) 항목을 열거 할 때 즉, 열거자가 생성되기 전에 기본 컬렉션에 변경 사항이있는 경우 열거 형에 반영됩니다.

+0

완벽한 ... 알겠습니다 ... 감사합니다. – mchicago

3

ToList 항상 목록의 단순 복사본을 만드는 것, 즉 반환 된 목록 IEnumerable이하는 소스로 같은 객체를 참조하는 것입니다,하지만 목록이 원본의 복사본입니다 돌아왔다.

MSDN을 참조하십시오. 이 결과는 원래 열거 별도의 목록, 그래서 .ToList() 후 변경 사항이이 목록에 반영되지 않습니다 - .ToList() 세력 전체 열거 열망 실행을 호출