2010-03-10 37 views
5
var trimmed = myStringArray.Select(s => s.Substring(0, 10)); 

Nếu một trong các chuỗi không dài 10 ký tự, tôi sẽ nhận được một ArgumentOutOfRangeException.LINQ Iterator Exception Handling

Trong trường hợp này nó khá tầm thường để tìm hiểu và tôi biết tôi có thể làm

s.Substring(0, Math.Min(10, s.Length)) 

Với lỗi xây dựng đối tượng phức tạp hơn như thế này không phải lúc nào cũng dễ thấy mặc dù. Có cách nào để xem chuỗi nào không đủ dài thông qua xử lý ngoại lệ?

Trả lời

2

Tạo phương pháp thực hiện phép biến đổi phức tạp có thể ném ngoại lệ và gọi nó từ lambda. ví dụ. .Chọn (s => complexMethod (s))

string complexMethod(string s) 
{ 
    try 
    { 
    ... 
    return ... 
    } 
    catch 
    ... 
} 

Bây giờ bạn có thể đăng nhập các ngoại lệ trong khối catch trước khi tái ném, hoặc sử dụng Exception.Data để thêm thông tin vào nó trước khi tái ném, hoặc bọc nó trong một ngoại lệ tùy chỉnh với thông tin bạn cần. Hãy nhớ sử dụng chỉ là 'ném' khi bạn ném lại nó nếu nó không phải là một ngoại lệ tùy chỉnh.

Bạn cũng có thể đặt inline phương pháp cơ thể trong lambda: .Select(s => { ... return ...})

+0

tôi chỉ sử dụng cú pháp khối phương pháp trên cái gì khác ngày hôm qua và thậm chí không thực hiện kết nối. Cảm ơn! – kwcto

0

Miễn là bạn sẽ không sử dụng nó với LinqToSQL hoặc EF, bạn có thể tạo phương thức mở rộng của riêng bạn bao bọc ngoại lệ và cho bạn biết giá trị của chuỗi.

0

Trong trường hợp này một mệnh đề WHERE có thể thích hợp để lọc ra chiều dài bạn đang tìm kiếm:

var trimmed = myStringArray 
     .Where(s => s.Length >= 10) 
     .Select(s => s.Substring(0, 10)); 

EDIT
Chỉ cần đọc lại những câu hỏi nhận ra OP đang tìm kiếm xử lý ngoại lệ để xem những chuỗi nào không đủ dài. Giả sử bạn không quan tâm những chuỗi nào đủ dài, thì giải pháp được cung cấp sẽ hoạt động.