2012-01-15 23 views
29

Tôi không sử dụng Single trong LINQ dưới đây, nhưng tôi vẫn nhận được một 'Chuỗi không chứa yếu tố' ngoại lệ:Chuỗi không chứa các yếu tố ngoại lệ trong LINQ mà không cần sử dụng đơn

allNames = StockCollection.Where((s) => s.Name.IndexOf("A") == 0) 
          .Select((s) => s.Name) 
          .Aggregate((namesInfo, name) => namesInfo += ", " + name); 

ngoại lệ này được đưa ra khi có không có cổ phiếu nào bắt đầu bằng tên 'A'.

Dường như một phương pháp khuyến nông dự kiến ​​ít nhất một phần tử thỏa mãn điều kiện nhưng điều đó không được mong đợi.

Bạn có thể đề xuất giải pháp tốt nhất để giải quyết vấn đề này không?

Xin cảm ơn trước.

Trả lời

56

Như Dennis Traub đã chỉ ra, sự quá tải của Aggregate bạn đang sử dụng ném ngoại lệ là khi chuỗi nguồn trống.

Sửa lỗi rõ ràng là sử dụng other overload of Aggregate that accepts an initial seed (bạn muốn string.Empty), nhưng điều đó sẽ dẫn đến dấu phẩy hàng đầu trong kết quả mà bạn sẽ phải loại bỏ.

(EDIT:. Bạn có thể né tránh điều này với .DefaultIfEmpty(string.Empty) tiếp theo Aggregate tình trạng quá tải hiện tại của bạn này sẽ không tạo ra một dấu phẩy hàng đầu.)

Trong mọi trường hợp, sử dụng Aggregate như thế để tham gia chuỗi không phải là một ý tưởng tuyệt vời (tạo ra một Schlemiel the Painter's algorithm). Đây là cách tôi sẽ viết truy vấn:

allNames = string.Join(",", StockCollection.Select(s => s.Name) 
              .Where(name => name.StartsWith("A")); 

Trong .NET 3.5, bạn sẽ cần a. ToArray() để thực hiện các kết quả Where thành một mảng.

+0

Cảm ơn rất nhiều vì đã trả lời tôi sẽ thử ngay bây giờ .. Nhưng tôi vẫn muốn biết tại sao tổng hợp lại ném ngoại lệ. –

+0

@D J: Tại sao? Giá trị hợp lý nào có thể trở lại? Có lẽ giá trị mặc định của kiểu trả về ('null' trong trường hợp này), nhưng tôi không muốn điều đó. – Ani

+1

Vấn đề là như chúng ta không biết tại thời điểm chạy bộ sưu tập của chúng tôi sẽ có bất kỳ đối tượng hay không? do đó, nó không nên ném một ngoại lệ hoặc nó chỉ có thể trả về giá trị mặc định. –

8

Sử dụng với hạt trống.

new string[]{}.Aggregate("", (a,b)=> a+b) 
Các vấn đề liên quan