2016-01-22 17 views
5

Tôi đang đối mặt với ngoại lệ này khi tôi đang sử dụng String.Split với các chuỗi ngẫu nhiên.Làm thế nào để ngăn chặn một System.IndexOutOfRangeException trong một LINQ WHERE?

List<string> linhas = new List<string>(); 

linhas.Add("123;abc"); 
linhas.Add("456;def"); 
linhas.Add("789;ghi"); 
linhas.Add("chocolate"); 

var novas = linhas.Where(l => l.ToString().Split(';')[1]=="def"); 
+1

Lưu ý bạn không cần 'ToString' trong đó. – juharr

+0

Bạn nhận được ngoại lệ vì itme cuối cùng trong danh sách không chứa ';' ('linhas.Add (" chocolate ");') – Rahul

+1

Câu hỏi này không liên quan gì đến LINQ. Bạn đã làm gì để điều tra vấn đề này? Để giúp bạn bắt đầu: Thực hiện "sô cô la" .Split (';') [1] '. – usr

Trả lời

12

Chuỗi cuối cùng "chocolate" không chứa một ";", vì vậy String.Split trả về một mảng với một chuỗi duy nhất "chocolate". Đó là lý do tại sao bạn nhận được ngoại lệ nếu bạn cố gắng truy cập vào thứ hai.

Bạn có thể sử dụng ElementAtOrDefault trả về null cho các chuỗi thay vì:

var novas = linhas.Where(l => l.Split(';').ElementAtOrDefault(1) == "def"); 

Một cách tiếp cận còn sử dụng một loại vô danh:

var novas = linhas 
    .Select(l => new { Line = l, Split = l.Split(';') }) 
    .Where(x => x.Split.Length >= 2 && x.Split[1] == "def") 
    .Select(x => x.Line); 
+2

trong khi điều này sẽ "làm việc" (đối với một số định nghĩa nhất định của công việc) Tôi nghĩ rằng rất nhiều sẽ giành được từ ngồi trong một phút, suy nghĩ về lý do tại sao có những mục trong danh sách không có những gì chúng ta cần. nó có phải là vấn đề với danh sách không? nó sẽ là một loạt các bộ/KVpairs? chúng ta nên khử trùng đầu vào? vv Tôi nghĩ đây là một trường hợp chỉ đơn giản là "làm cho nó hoạt động" là hacky và sẽ chỉ dẫn đến các vấn đề tương tự sau này. xác định yêu cầu kinh doanh và tìm cách tốt hơn để đóng gói nó. – kai

+3

@kai: tôi hoàn toàn không có ý tưởng về những gì OP cần nó. Vì vậy, tôi không thể đưa ra giả định về việc đây có phải là một cách tiếp cận tốt hay không. Chúng ta biết quá ít và mẫu của OP cũng có thể được mô phỏng. –

+2

Bạn không cần giả định rằng op không chính xác là nhà phát triển có kinh nghiệm nhất và có thể có vấn đề x/y ở đây:/ – Will

1

tôi sẽ mở rộng một chút về câu trả lời và hiển thị của Tim một cách để thực hiện thêm một vài thứ trong các truy vấn LINQ của bạn.

Bạn có thể mở rộng logic trong mệnh đề Where để thực hiện một số quy trình bổ sung, điều này có thể làm cho mã của bạn dễ đọc hơn một chút. Đây sẽ là tốt cho một cái gì đó nhỏ:

var novas = linhas.Where(l => 
      { 
       var parts = l.Split(':'); 

       return parts.Length > 1 ? parts[1] == "def" : false; 
      }); 

Nếu bạn cần nhiều báo cáo, bạn có thể quấn cơ thể của khoản của bạn trong vòng curly braces, nhưng sau đó bạn cần từ khóa return.

Ngoài ra, nếu bạn có nhiều thông tin sẽ làm cho nội dung nào đó giống như không đọc được, bạn cũng có thể sử dụng một phương pháp riêng trong truy vấn của mình.

public void FindTheStringImLookingFor() 
{ 
    var linhas = new List<string>(); 

    linhas.Add("123;abc"); 
    linhas.Add("456;def"); 
    linhas.Add("789;ghi"); 
    linhas.Add("chocolate"); 

    var words = linhas.Where(GetTheStringIWant); 
} 

private bool GetTheStringIWant(string s) 
{ 
    var parts = s.Split(':'); 

    // Do a lot of other operations that take a few lines. 

    return parts.Length > 1 ? parts[1] == "def" : false; 
} 
Các vấn đề liên quan