Làm cách nào để ghép hai IEn Countable <T> thành một IEnumerable <T> mới?


201

Tôi có hai trường hợp IEnumerable<T>(với giống nhau T). Tôi muốn một ví dụ mới IEnumerable<T>là sự kết hợp của cả hai.

Có một phương thức tích hợp trong .Net để làm điều đó hay tôi phải tự viết nó?


9
Bạn có thể muốn đánh dấu mã.msdn.microsoft.com/101-LINEQ-Samples-3fb9811b .
C-Pound Guru

Câu trả lời:


332

Có, LINQ to Object hỗ trợ điều này với Enumerable.Concat:

var together = first.Concat(second);

NB: Nên firsthoặc secondlà null bạn sẽ nhận được a ArgumentNullException. Để tránh điều này và xử lý null như bạn sẽ làm một tập hợp trống, hãy sử dụng toán tử hợp nhất null như vậy:

var together = (first ?? Enumerable.Empty<string>()).Concat(second ?? Enumerable.Empty<string>()); //amending `<string>` to the appropriate type

1
Tôi luôn quên tìm kiếm các phương pháp mở rộng, tx.
Samuel Rossille

10
@SamuelRossille Cũng đừng quên rằng tên của các hành động bạn muốn thực hiện có khả năng đóng nếu không được gọi chính xác là những gì bạn đang theo sau. Luôn duyệt IntelliSense, bạn học được rất nhiều.
Adam Houldsworth

3
Có phải là xấu khi làm thứ hai = First.Concat (thứ hai)? chúng tôi sẽ có bất kỳ vấn đề tương tranh?
dùng2934433

4
@ user2934433: Không, điều đó hoàn toàn tốt.
Jon Skeet

2
Chỉ là một ghi chú nhanh. Cần phải nhập using System.Linq không gian tên ở đầu tệp mã để xem phương thức mở rộng mong muốn trong intellisense IDE.
RBT

19

Các Concatphương pháp sẽ trả về một đối tượng mà cụ IEnumerable<T>bằng cách trả lại một đối tượng (gọi nó là Cát) mà điều tra viên sẽ cố gắng sử dụng hai thông qua trong mục đếm được (gọi họ là A và B) theo thứ tự. Nếu các liệt kê được truyền vào biểu thị các chuỗi sẽ không thay đổi trong suốt vòng đời của Cat và có thể được đọc từ mà không có tác dụng phụ, thì Cat có thể được sử dụng trực tiếp. Nếu không, nó có thể là một ý tưởng tốt để gọi ToList()về Catvà sử dụng kết quả List<T>(mà sẽ đại diện cho một bản chụp của các nội dung của A và B).

Một số liệt kê chụp ảnh nhanh khi liệt kê bắt đầu và sẽ trả về dữ liệu từ ảnh chụp nhanh đó nếu bộ sưu tập được sửa đổi trong quá trình liệt kê. Nếu B là vô số, thì bất kỳ thay đổi nào đối với B xảy ra trước khi Cat đến cuối A sẽ xuất hiện trong bảng liệt kê của Cat, nhưng những thay đổi xảy ra sau đó sẽ không xảy ra. Ngữ nghĩa như vậy có thể có thể gây nhầm lẫn; chụp ảnh nhanh của Cat có thể tránh được những vấn đề như vậy.


7

Bạn có thể sử dụng mã dưới đây cho giải pháp của mình: -

public void Linq94() 
{ 
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; 
    int[] numbersB = { 1, 3, 5, 7, 8 }; 

    var allNumbers = numbersA.Concat(numbersB); 

    Console.WriteLine("All numbers from both arrays:"); 
    foreach (var n in allNumbers) 
    { 
        Console.WriteLine(n); 
    } 
}

0
// The answer that I was looking for when searching
public void Answer()
{
    IEnumerable<YourClass> first = this.GetFirstIEnumerableList();
    // Assign to empty list so we can use later
    IEnumerable<YourClass> second = new List<YourClass>();

    if (IwantToUseSecondList)
    {
        second = this.GetSecondIEnumerableList();  
    }
    IEnumerable<SchemapassgruppData> concatedList = first.Concat(second);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.