2015-10-21 14 views
6

Tôi có các tình huống sau khi nhóm một bộ sưu tập:C# IEnumerable.Count() throws IndexOutOfRangeException

var result = data.GroupBy(x => x.Name.Split(new char[] { '-' })[1].Trim()); 

nơi biến dữ liệu là loại ObservableCollection<Data>

Khi tôi kiểm tra

if(result.Count()>0) 

nó ném một số IndexOutOfRangeException

tất nhiên điều này xảy ra bởi vì hoạt động tách chuỗi đưa ra một ngoại lệ.

Câu hỏi đặt ra là: có cách nào để kiểm tra xem kết quả của nhóm không phải là không và tránh ngoại lệ?

+3

Bạn đang chia nhỏ theo '-' và truy cập mảng này tại chỉ mục 1 là mục thứ hai. Rõ ràng không có mục thứ hai vì không có '-'. Vì vậy, nó không có gì để làm với 'null'. –

+0

Có, tôi biết, có cách nào để kiểm tra độ dài của mảng bên trong nhóm bằng câu lệnh không? –

+0

resut.Any() có thể thực hiện thủ thuật? –

Trả lời

10

Trước hết, Enumerable.Count chỉ thực hiện truy vấn LINQ được thực hiện chậm (GroupBy sử dụng thực thi hoãn lại, xem phần nhận xét). Vì vậy, Count không phải là để đổ lỗi ở đây.

Bạn đang chia tách theo - và truy cập mảng này tại chỉ mục 1 là mục thứ hai. Rõ ràng không có mục thứ hai vì không có -. Vì vậy, nó không có gì để làm với null.

Có lẽ nó là đủ để lấy chỉ những nơi có một mã thông báo thứ hai:

var result = data 
.Select(x => new{ Data = x, Split = x.Name.Split(new char[] { '-' }) }) 
.Where(x => x.Split.Length >= 2) 
.GroupBy(x => x.Split[1].Trim()); 

hoặc thứ hai nếu có một thứ hai, nếu không là người đầu tiên:

var result = data 
.Select(x => new{ Data = x, Split = x.Name.Split(new char[] { '-' }) }) 
.GroupBy(x => x.Split.Length >= 2 ? x.Split[1].Trim() : x.Split[0].Trim()); 
+0

... hoặc thậm chí một nhóm với một tên nhóm trống (giống như) var result = data.GroupBy (x => (x.Name! = null && x.Name.Contains ('-'))? x.Name.Split (new char [] {'-'}) [1] .Trim(): ""); –

+0

Câu trả lời tuyệt vời Tim, cảm ơn rất nhiều –

2

Bạn có thể làm sau đây:

var result = data.GroupBy(x => x.Name.Contains('-') ? x.Name.Split('-')[1].Trim() : ""); 

Nếu bạn không thích những : nhà điều hành hoặc muốn cho nó ít nhỏ gọn, sử dụng:

var result = data.GroupBy(x => 
{ 
    string name = x.Name; 
    if (name.Contains('-')) return name.Split('-')[1].Trim(); 
    return ""; 
}); 

Lưu ý: tôi đã sử dụng Split('-') thay vì Split(new char[] { '-' })

Đây có lẽ là trực quan hơn các giải pháp của Tim Schmelter, nhưng sử dụng những gì bạn muốn.

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