2009-08-26 26 views
14

Tôi không quan tâm đến thứ tự của các phần tử.Tốc độ nào nhanh hơn: Union hoặc Concat?

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.union.aspx

http://msdn.microsoft.com/en-us/library/bb302894.aspx

+11

Hãy thử nó cả hai cách. Lấy ra một đồng hồ bấm giờ. Sau đó, bạn sẽ biết. Hiệu suất "phân tích" dựa trên * phỏng đoán *, bất kể cách được đào tạo, không thực sự hữu ích làm cơ sở để đưa ra quyết định * kỹ thuật *. –

Trả lời

49

Liên minh loại bỏ các bản sao. Concat không.

Vì vậy, chúng tạo ra các kết quả khác nhau nếu nguồn có chứa bất kỳ mục nào chung hoặc có bất kỳ bản sao nội bộ nào.

Nếu bạn có thể đảm bảo không có bản sao, hoặc nếu có ít và bạn không quan tâm đến việc có chúng trong đầu ra của bạn, Concat sẽ nhanh hơn vì không cần phải kiểm tra từng giá trị so với những gì đã được mang lại.

Tuy nhiên, nếu có nhiều bản sao và bạn không cần chúng, quá trình xử lý bổ sung trong Liên minh để loại bỏ hai lần có thể được bù đắp bằng khoản tiết kiệm trong mã của bạn tiêu thụ kết quả.

9

Bạn chỉ quan tâm đến tốc độ thực thi? Mất bao lâu để bạn xử lý một phần tử khi bạn nhận được nó?

Concat đơn giản hơn - không cần thực hiện bất kỳ quá trình xử lý nào hoặc đệm kết quả đã được trả lại. Tuy nhiên, nó sẽ tạo ra nhiều kết quả hơn nếu có bất kỳ yếu tố nào trong giao lộ. Nếu bạn sẽ mất nhiều thời gian để xử lý từng kết quả, thì Concat có thể kết thúc hiệu quả hơn bị chậm hơn.

+0

Trong trường hợp của tôi, tôi sẽ sử dụng một Distinct() cuối cùng, mà ủng hộ việc sử dụng của Liên minh tôi nghĩ. –

+6

Nếu bạn sử dụng Union thì bạn không cần phải gọi riêng biệt sau đó. –

+2

Liên minh loại bỏ các trùng lặp giữa các danh sách, nhưng nếu danh sách đầu tiên có các bản sao trong chính nó, những danh sách đó sẽ không bị xóa bỏ bởi công đoàn. Vì vậy - Có thể cần phải gọi riêng biệt, tùy theo hoàn cảnh. –

3

Điều đã nói ở trên là đúng. Dưới đây chỉ là một bổ sung rất ít đối với một số trường hợp đặc biệt:

Nếu bạn phải tiếp nhau ví dụ hai danh sách và nếu bạn cần tốc độ đầy đủ, xem xét sử dụng năng suất. Tất nhiên điều này ít linh hoạt hơn và thoải mái hơn Union hoặc Concat trong LINQ. Do đó nó chỉ có ý nghĩa trong trường hợp đặc biệt.

sở hữu ví dụ này sẽ cung cấp giống như List1.Concat (List2)

public IEnumerable<MyObject> AllObjects 
    { 
     get 
     { 
      foreach (MyObject o1 in List1) 
       yield return o1; 

      foreach (MyObject o2 in List2) 
       yield return o2; 
     } 
    } 
+0

'Concat' chính xác theo cách bạn hiển thị nó trong ví dụ (xem: [source] (https://referencesource.microsoft.com/#System.Core/System/Linq/ Enumerable.cs # 800)). Vì vậy, không cần phải thực hiện nó bằng cách của riêng bạn. – scher

Các vấn đề liên quan