Tôi đoán rằng String.Join đòi hỏi khả năng lặp qua mảng hai lần (một lần để đo chiều dài, và một lần để làm bản sao). Một số lớp thực hiện iEnumerable có thể được nối thành công thành một mảng chuỗi bằng cách thực hiện một lần để đếm chiều dài, gọi Reset trên điều tra viên, và sử dụng thẻ thứ hai để sao chép dữ liệu, nhưng vì iEnumerable không hỗ trợ cả thuộc tính Capabilities hay gia đình của các lớp dẫn xuất như iMultiPassEnumerable, cách duy nhất String.Join có thể chấp nhận một cách an toàn một iEnumerable sẽ là (1) liệt kê một số loại danh sách và chạy tham gia vào đó, (2) đoán kích thước chuỗi đích và phân bổ lại thành cần thiết, hoặc (3) kết hợp các phương pháp tiếp cận, nhóm các chuỗi ngắn thành các cụm lên đến ví dụ 8K, và sau đó kết hợp tất cả các cụm vào một kết quả cuối cùng (đó sẽ là một hỗn hợp của các cụm trước khi nối và các chuỗi dài từ mảng ban đầu).
Mặc dù tôi chắc chắn sẽ cho phép String.Join có thể chuyển đổi một iEnumerable thành Danh sách, tôi không thấy rằng nó sẽ cung cấp hiệu quả hơn so với thực hiện chuyển đổi theo cách thủ công (không giống như phiên bản mảng của String.Join, có hiệu quả hơn việc ghép nối các chuỗi riêng theo cách thủ công).
Bạn sẽ rất vui khi biết rằng nó chấp nhận 'IEnumerable 'trong.NET 4 –
Đoán của tôi là nó đã được thêm trước khi IEnumerable tồn tại. – asawyer
string.Join đã ở đây rất lâu trước Linq. Làm thế nào nó làm phiền bạn? Chỉ còn vài ký tự nữa để viết. –