2012-03-01 2 views
14

Dưới đây là một số mẫu mã:Có cách nào dễ dàng để thêm một IList <MyType> cho người khác không?

IList<MyType> myList1=new List<MyType>(); 
IList<MyType> myList2=new List<MyType>(); 

// Populate myList1 
... 
// Add contents of myList1 to myList2 
myList2.Add(myList1); // Does not compile 

Làm thế nào để tôi thêm các nội dung của một danh sách những việc khác - là có một phương pháp cho việc này?

+0

'targetList.AddRange (sourceList);' – vulkanino

+1

@vulkanino 'AddRange' là một phương thức' List <> ', không phải là' IList <> '. – phoog

+0

vâng, xin lỗi, ý tôi là một diễn viên mà tôi không chỉ định. – vulkanino

Trả lời

24

Không có cách nào tích hợp sẵn để thực hiện việc này. Thực sự những gì bạn muốn là một phương pháp AddRange nhưng nó không tồn tại trên IList<T> (hoặc phân cấp của nó). Xác định một phương pháp khuyến nông mới dù cho điều này là thẳng về phía trước

public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> enumerable) { 
    foreach (var cur in enumerable) { 
    collection.Add(cur); 
    } 
} 

myList2.AddRange(myList1); 
+0

@downvoter chăm sóc để giải thích? – JaredPar

+0

Tôi là một người upvoter, không phải là một downvoter, nhưng nó có thể là do "nó quá mức cần thiết để khai báo một phương thức cho một nhiệm vụ đơn giản như vậy." Tôi nhận được những lời chỉ trích tương tự cho một câu trả lời của tôi; phương pháp có thể là 5 hoặc 6 dòng mã, chỉ lưu một vài dòng mã tại trang cuộc gọi. Nhưng trang web cuộc gọi đã được thay đổi thành một biểu thức duy nhất chứ không phải là 2 hoặc 3 câu lệnh, và, tất nhiên, nếu phương pháp được sử dụng nhiều hơn một số lần, có sự giảm ròng trong các dòng mã. – phoog

+0

@phoog yeah, nếu tôi đã sử dụng nó chỉ một lần tôi sẽ chỉ inline 'foreach'. Điều này mặc dù là một trong những phương pháp mở rộng tiêu chuẩn (như 'ForEach') mà tôi chỉ xác định trong mọi dự án tôi viết. Chúng cực kỳ hữu ích. – JaredPar

0

Nếu loại thời gian chạy của danh sách thứ hai là List<T>, bạn có thể truyền sang loại đó và sử dụng phương thức AddRange().

Nếu không, bạn phải tự làm điều đó với một vòng lặp. Ngoài ra, bạn có thể sử dụng LINQ để tạo danh sách mới chứa nội dung của cả hai danh sách nguồn.

10

Nếu bạn khai báo cả hai loại danh sách như bê tông các List thay vì IList, bạn có thể sử dụng AddRange phương pháp:

List<MyType> myList1=new List<MyType>(); 
List<MyType> myList2=new List<MyType>(); 

myList2.AddRange(myList1); 

nếu không bạn có thể sử dụng LINQ để kết hợp cả hai:

using System.Linq; 

IList<MyType> myList1=new List<MyType>(); 
IList<MyType> myList2=new List<MyType>(); 

var newList = myList1.Concat(myList2); 
+1

Mặc dù giải pháp LINQ có vẻ đẹp tại điểm gọi, nó có hiệu quả không làm một danh sách mới với các mục được kết hợp. –

+0

Michael, bất kỳ cách nào có ưu và contras (: –

11

Sử dụng tiện ích mở rộng Enumerabl,

myList2=new List<MyType>(myList2.Concat(myList1)) 

BTW, nếu bạn không điền myList2, bạn chỉ có thể tạo nó dựa trên myLis1.

EDIT

Tôi đã cố gắng Biến nghiên cứu trong vài trường hợp

1) AddRange qua Thêm

List2.AddRange(List1); 

public static class AddRangeUtils 
{ 
    public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> enumerable) 
    { 
     foreach (var cur in enumerable) 
     { 
      collection.Add(cur); 
     } 
    } 
} 

2) Concat

List2 = new List<TestClass>(List2.Concat(List1)) 

3) Predefined Collection Đếm 1

var thirdList = new List<TestClass>(List2.Count + List1.Count); 
foreach (var testClass in List1) 
{ 
    thirdList.Add(testClass); 
} 
foreach (var testClass in List2) 
{ 
    thirdList.Add(testClass); 
} 
List2 = thirdList; 

4) Predefined Collection Đếm Đếm 2

var thirdList = new List<TestClass>(List2.Count + List1.Count); 
thirdList.AddRange(List1); 
thirdList.AddRange(List2); 
List2 = thirdList; 

Bộ sưu tập là số lượng các yếu tố cho mỗi danh sách, List1 và List2: Và đến kết quả như vậy (có chiều dài bộ sưu tập khác nhau)

results for calculation

+1

Điều này không thêm giá trị vào 'myList2' mặc dù nó thay vì tạo ra một giá trị mới' Danh sách 'Điều này là khác với những gì OP được yêu cầu. – JaredPar

+0

Của cource Ok, tôi đã sửa đổi nó thành myList Ok, tôi đã sửa đổi –

+2

Điều này có độ phức tạp thời gian khủng khiếp nếu nhiều danh sách được nối thêm. –