2011-06-29 38 views

Trả lời

37

Nó sẽ không được hiệu quả hơn, tuy nhiên nó sẽ là một chút bụi để làm điều gì đó như:

var strings = new string[] { "1", "02", "003", "0004", "00005" }; 

string longest = strings.OrderByDescending(s => s.Length).First(); 

Output: 00005

+0

tuyệt vời! cảm ơn, tôi đã sử dụng FirstOrDefault(). Nó chắc chắn trông sạch hơn, nhưng có lợi thế về mặt hiệu suất? – vrrathod

+0

@vrrathod Không có hiệu suất đạt được, nó vẫn làm logic lặp đi lặp lại bạn đã có, nó chỉ là một cú pháp ngắn gọn hơn, đó là những gì LINQ là tất cả về. –

+0

Nó chắc chắn làm điều tương tự. Đây là cách tôi thử nghiệm. Tôi đã tạo một chuỗi gồm 5000 chuỗi. LINQ mất khoảng 15 cpu ve trên máy tính của tôi. Tôi đã viết một vòng lặp thời trang cũ so sánh độ dài của chuỗi. Nó trả về 0 lần. Khác biệt tôi đoán là để phân loại. – vrrathod

9
string [] strings; 
return strings.OrderByDescending (s => s.Length).First(); 
2
string[] arr = new string[] { "a", "aa", "aaa" }; 

var longest = arr.Where(s => s.Length == arr.Max(m => m.Length)).First(); 

đầu ra aaa

Bằng cách này, mã rõ ràng sẽ giúp bạn nhận được chuỗi có độ dài tối đa.

+0

điều này chắc chắn hoạt động. Nhưng nó là của O (N^2), do đó, nó sẽ mất lâu hơn một chút so với câu trả lời khác. Ví dụ: trên chuỗi chuỗi 5000 'strings.OrderByDescending (s => s.Length). Đầu tiên();' sẽ trả lại trong khoảng 15 CPU tick trên máy tính của tôi, trong khi điều này sẽ mất khoảng 390. ve. – vrrathod

+0

Vâng, tôi nhận ra điều này. Tôi đặt nó lên bởi vì nó nói những gì nó đang làm, thay vì sử dụng một tác dụng phụ của trật tự. –

-1

Tôi không có trình biên dịch ngay bây giờ nhưng điều này cũng sẽ hoạt động.

string[] arr = new string[] { "a", "aa", "aaa" }; 
var longest = arr.Max(w => w.Length) 
+1

Điều này tìm thấy độ dài lớn nhất nhưng không tìm thấy chính chuỗi đó. – Vache

9
strings.Aggregate(string.Empty, (seed, f) => f.Length > seed.Length ? f : seed); 

cú pháp tổng hợp là hơi khó đọc hơn so với các phương pháp khác, nhưng nói đúng nó hiệu quả hơn các phương pháp khác mà tôi thấy ở đây vì nó không đòi hỏi phân loại. Chỉ cần thực hiện O (N).

EDIT: Cách tiếp cận này, cùng với hầu hết những người khác ở đây giả định không có giá trị null trong danh sách của bạn, vì sợ rằng f.Length ném một ngoại lệ ref rỗng. Một toán tử ternary nhanh (f! = Null? F.Length: 0) sẽ sửa chữa nếu nó là hợp lệ cho số đếm của bạn.

+0

Tôi thích câu trả lời này vì nó thực sự trả lời câu hỏi * và * tôi tin rằng nó là hiệu quả nhất cho một câu trả lời mục đơn lẻ khi không cần danh sách toàn bộ các từ dài nhất * và * với chỉnh sửa bổ sung, Caleb đề cập đến xử lý null dây quá. Hai ngón tay cái lên từ tôi! Để thuận tiện: đây là mã tôi đã thử nghiệm hoạt động tốt: 'string longest = strings.Aggregate (chuỗi.Rỗng, (hạt giống, f) => (f == null? 0: f.Length)> seed.Length? f: hạt giống); ' –

2

Mặc dù đây là câu hỏi cũ tôi muốn thêm rằng câu trả lời hiệu quả nhất không được cung cấp. Nó không phải là một lớp lót, nhưng nó là nhanh nhất và trả về một tập hợp các chuỗi dài nhất, mà OrderBy hoặc Tổng hợp không cung cấp. Matt Ellen là người gần gũi nhất với câu trả lời của anh ta, nhưng sử dụng Max trong phạm vi của anh ta làm cho nó khá chậm khi bạn đang làm việc với một bộ sưu tập lớn.

Câu trả lời đúng nên là:

int maxLength = collection.Max(x => x.Length); 
string[] longestStrings = collection.Where(x => x.Length == maxLength); 

Cân nhắc sử dụng?. (trong C# 6.0) và ?? các toán tử để kiểm tra các giá trị null nếu bộ sưu tập của bạn có thể chứa các giá trị này.

+1

chỉnh sửa: câu hỏi yêu cầu một chuỗi không phải là danh sách các chuỗi dài nhất. mã của bạn cũng cần một '.ToArray() 'trước dấu chấm phẩy cuối cùng để biên dịch. Nhưng tôi khen ngợi bạn về việc cung cấp mã có thể dễ dàng được sử dụng để cung cấp danh sách các từ dài nhất hoặc chỉ từ đầu tiên, với '.FirstOrDefault()' đơn giản so với '.ToArray()' ở cuối mã của bạn . Cá nhân tôi thích sự linh hoạt của giải pháp này, vì vậy tôi giống như những gì giải pháp của bạn cung cấp. Cảm ơn! –

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