2010-11-25 24 views
2

我無法合併列表和列表? OOP說MyType2是MyType的...c#通用列表合併

using System; 
using System.Collections.Generic; 

namespace two_list_merge 
{ 
    public class MyType 
    { 
     private int _attr1 = 0; 

     public MyType(int i) 
     { 
      Attr1 = i; 
     } 

     public int Attr1 
     { 
      get { return _attr1; } 
      set { _attr1 = value; } 
     } 
    } 

    public class MyType2 : MyType 
    { 
     private int _attr2 = 0; 

     public MyType2(int i, int j) 
      : base(i) 
     { 
      Attr2 = j; 
     } 

     public int Attr2 
     { 
      get { return _attr2; } 
      set { _attr2 = value; } 
     } 
    } 

    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      int count = 5; 
      List<MyType> list1 = new List<MyType>(); 
      for(int i = 0; i < count; i++) 
      { 
       list1[i] = new MyType(i); 
      } 

      List<MyType2> list2 = new List<MyType2>(); 
      for(int i = 0; i < count; i++) 
      { 
       list1[i] = new MyType2(i, i*2); 
      }   

      list1.AddRange((List<MyType>)list2); 
     } 
    } 
} 
+0

在我的問題的主要觀點是方式? – 2010-11-25 18:45:18

回答

2

如果您正在使用C#4(.NET 4),你可以簡單地刪除該投中的最後一行:

list1.AddRange(list2); 

如果」再使用C#3(.NET 3.5),您需要使用CAST()LINQ擴展:

list1.AddRange(list2.Cast<MyType>()); 

,你可以不投列表2列出的理由是,名單是不是協變。你可以找到爲什麼這裏是不是這樣一個很好的解釋:

In C#, why can't a List<string> object be stored in a List<object> variable

第一線工作的原因是的AddRange()接受一個I​​Enumerable和IEnumerable是協變的。 .NET 3.5沒有實現泛型集合的協變,因此需要C#3中的Cast()。

0

也許嘗試使用LINQ如果可以的話,有一個顯式的MyType一起。使用C#4

List<MyType> list1 = new List<MyType> 
    { new MyType(1), new MyType(2), new MyType(3)}; 

List<MyType2> list2 = new List<MyType2> 
    { new MyType2(11,123), new MyType2(22,456), new MyType2(33, 789) }; 

var combined = list1.Concat(list2.AsEnumerable<MyType>()); 
0

你不能這樣做,因爲MyType2是MyType的,但List<MyType2>List<MyType>。 2 List<XXX>類型之間沒有繼承關係。

您可以通過使用LINQ的Cast方法輕鬆地進行復制,這會將每個元素轉換爲您想要的類型。

list1.AddRange(list2.Cast<MyType>());