2010-03-29 42 views
21

Nếu tôi có 5 biến Chuỗi và từ 0 đến 5 trong số đó là rỗng hoặc trống thì có cách dễ dàng/ngắn để trả về biến đầu tiên không phải là null hoặc trống? Tôi đang sử dụng NET 3,5Làm cách nào để trả lại biến chuỗi đầu tiên không rỗng hoặc rỗng

+0

Bạn có thể cập nhật câu hỏi của mình để chỉ ra phiên bản .NET bạn đang sử dụng không? –

+0

.NET 3.5. Điểm tốt! –

Trả lời

24
var myString = new string[]{first, second, third, fouth, fifth} 
     .FirstOrDefault(s => !string.IsNullOrEmpty(s)) ?? ""; 

//if myString == "", then none of the strings contained a value 

chỉnh sửa: lấy ở đâu(), đặt vị trong FirstOrDefault(), nhờ Yuriy

+3

Bạn không cần ở đâu, hãy sử dụng http://msdn.microsoft.com/en-us/library/bb549039.aspx –

+0

'.FirstOrDefault (x =>! String.IsNullOrEmpty (x))' với tùy chọn ' ?? string.Empty' nếu bạn không muốn null. – Will

+0

@Yuriy nó được cập nhật với không cần thiết Nơi bị xóa .. – dan

8
private static string FirstNonEmptyString(params string[] values) 
    { 
     return values.FirstOrDefault(x => !string.IsNullOrEmpty(x)); 
    } 

gọi là như thế này:

 Console.WriteLine(FirstNonEmptyString(one, two, three, four, five)); 
13

Xác định một phương pháp khuyến nông:

static string Or(this string value, string alternative) { 
    return string.IsNullOrEmpty(value) ? alternative : value; 
} 

Bây giờ bạn có thể nói như sau:

string result = str1.Or(str2).Or(str3).Or(str4) … 
+0

+1 để mở rộng độ lạnh – stmax

+1

Eh. S'kay, nhưng không lười biếng. – Will

+0

Nếu giá trị đầu tiên không phải là rỗng hoặc trống, điều này sẽ vẫn kiểm tra tất cả các giá trị còn lại, ngoại trừ giá trị cuối cùng. Bốn chức năng cuộc gọi mà một trong những sẽ đủ. –

1

Nếu dây của bạn đang ở trong một IEnumerable bạn có thể sử dụng First hoặc FirstOrDefault:

strings.First(s => !string.IsNullOrEmpty(s)) 
+0

1) câu trả lời này đã được đưa ra 2) 'Đầu tiên' ném một IOE nếu tất cả các chuỗi rỗng hoặc rỗng – Will

+0

@Will, 1) Tôi nghĩ rằng tôi là người đầu tiên đề xuất Đầu tiên/FirstOrDefault là một sự thay thế rõ ràng ở đâu. 2) Người hỏi không chỉ rõ hành vi mà anh ta muốn trong trường hợp tất cả các chuỗi đều rỗng/rỗng. Đó là lý do tại sao tôi đề nghị cả hai. –

+0

hmmmm, đang diễn ra hồi tưởng về FOD. Lỗi của tôi. Tôi không tin anh ta nói bất cứ điều gì trong câu hỏi của anh ta về việc ném nếu tất cả các chuỗi đều không có giá trị. Bạn cũng không nói rằng sự thật nhỏ bé. "Ném đầu tiên" là thứ mà mọi người thường không nhận ra và nó sẽ cắn chúng vào mông. Nghĩ rằng nó có thể quan trọng đối với những người đọc để thấy điều đó. – Will

0

Nếu bạn đang sử dụng .NET 3.5 này rất dễ dàng với LINQ.

string[] strings = new[] {"", "a", "b", ""}; 

string firstNotNullOrEmpty = 
    strings.Where(s => !String.IsNullOrEmpty(s)).FirstOrDefault(); 
+1

'Đầu tiên' có ghi đè khiến cho 'Where' vô nghĩa. Ngoài ra, nếu tất cả các chuỗi là null, bạn sẽ ném một InvalidOperationException ở đây. Mà sẽ hút ass. – Will

+1

Tôi tìm thấy bao gồm Vị trí() giúp dễ đọc hơn. Tại sao nó sẽ ném 'InvalidOperationException'? – jrummell

+0

mở LINQPad và thử điều này: '(new string [] {(string) null}) Đầu tiên (x =>! String.IsNullOrEmpty (x))' Bạn sẽ thấy nó ném một IOE, vì First() là được thiết kế để thực hiện nếu không có kết quả phù hợp. FirstOrDefault() không bao giờ ném nếu không tìm thấy kết quả phù hợp; nó chỉ trả về 'mặc định (T)'. – Will

1
var found = new[]{first, second, third, fourth, fifth}.FirstOrDefault(x =>!String.IsNullOrEmpty(x)); 
0

Yes.

string selected = null; 
foreach(string currStr in strArray) 
    if(String.IsNullOrEmpty(currStr)==false) 
    { 
     selected = currStr; 
     break; 
    } 

Không có cây biểu thức, không lạm dụng LINQ, không có tính năng ngôn ngữ tối nghĩa. Cùng một hiệu suất thời gian chạy và một sinh viên CS năm đầu tiên có thể tìm ra những gì bạn đang làm.

+0

Tôi cảm thấy xấu cho các sinh viên CS năm đầu tiên, những người được giữ an toàn từ các tính năng ngôn ngữ tạo nên niềm vui. – Will

+0

@Will: LINQ lạm dụng là một vấn đề nghiêm trọng ảnh hưởng đến cộng đồng của chúng tôi, cho phép tất cả là một phần của giải pháp không phải là vấn đề. – kervin

+0

BTW Tôi yêu LINQ, tôi vừa chuyển đổi thư viện dựa trên XPath thành LINQ to XML tuần trước và EF là ORM của tôi. – kervin

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