2015-06-24 20 views
12

Tôi có các dòng sau trong mã của mình. Họ đang chiếm nhiều chỗ hơn họ nên làm. Bất kỳ đề xuất nào cho một mã nhỏ hơn.Nhận chuỗi dài nhất và ngắn nhất theo cách giả tạo

string longestString; 
string shortestString; 
if (string1.Length > string2.Length) 
{ 
    longestString = string1; 
    shortestString = string2; 
} 
else 
{ 
    longestString = string2; 
    shortestString = string1; 
} 

Tôi biết, không phải là câu hỏi thực sự quan trọng, nhưng điều này chiếm 2/3 toàn bộ phương pháp chứ không phải là nội dung quan trọng.

+5

'longString = string1.Length> string2.Length? string1: string2; ' –

+2

đúng cách để thực hiện. Một số điều không thể thực sự mang tính thẩm mỹ – xanatos

+1

Tuyệt đối không hiệu quả, nhưng chỉ để cho vui: 'var lst = new [] {string1, string2} .OrderBy (s => s.Length) .ToList(); string shortestString = lst [0]; string longestString = lst [1]; ' –

Trả lời

17

lẽ:

int diff = string1.Length.CompareTo(string2.Length); 
string longestString = diff > 0 ? string1 : string2; 
string shortestString = diff > 0 ? string2 : string1; 

Nhưng nếu bạn có nhiều hơn hai chuỗi những điều này và bạn muốn có một giải pháp chung, bạn có thể sử dụng:

var lenLookup = new[] { string1, string2 }.OrderBy(s => s.Length).ToList(); 
string shortestString = lenLookup.First(); 
string longestString = lenLookup.Last(); 
+1

Thú vị (và rất chính xác nhất trường hợp chung) mà bạn đã chọn để cache so sánh "thực", thay vì làm lại nó hai lần :-) Bằng cách này, số lượng truy cập vào 'string1' và' string2' giống như trong mã ban đầu ... vì vậy nó là "tương đương hơn". – xanatos

+1

Hoặc tương đương: 'bool s1bigger = string1.Length> string2.Length; string logestString = s1bigger? string1: string2; ... ' – xanatos

+0

Vâng, vì nó bật ra rằng tôi cũng cần phải 'tiền xử lý' chuỗi. Tôi thực sự đã sử dụng cái này. var cleaned = new [] {original, modified} .Chọn (s => Regex.Đặt lại (s, "[^ a-zA-Z]", "") .ToLower()) .OrderBy (s => s.Length); var shortest = cleaned.First(); var longest = cleaned.Last(); –

11

Kể từ mã của bạn sẽ luôn thực hiện một trong hai nếu hoặc đường dẫn khác, chọn một là "mặc định" và hợp nhất nó với khai báo biến:

string longestString = string2 
string shortestString = string1; 
if (string1.Length > string2.Length) 
{ 
    longestString = string1; 
    shortestString = string2; 
} 

điểm thưởng cho thực tế là bạn sẽ thực sự khởi những biến đó.

+2

Với báo trước rằng điều này hoạt động tốt nếu 'string1' và' string2' không gây ra tác dụng phụ khi được định vị. – xanatos

+0

Đọc lại OP tôi tích cực điều này sẽ không giới thiệu bất kỳ tác dụng phụ * bổ sung * nào (mã gốc cũng sẽ luôn nhận được cả hai chuỗi) – Alex

+0

Yep ... Đây chỉ là đặt dấu chấm trên * i * và dấu gạch ngang trên * t * ... tức là đang được sử dụng. – xanatos

1

Bạn có thể sử dụng ":" điều hành

string longestString = string1.Length > string2.Length ? string1 : string2; 
string shortestString = string1.Length > string2.Length ? string2 : string1; 
+0

@xanatos hãy xem kỹ hơn ở phần thứ hai của câu lệnh: "string2: string1" –

5

Vâng, bạn có thể làm điều này để xóa phương pháp của mình;

public string GetLongestString(string str1, string str2) 
{ 
    return str1.Length > str2.Length ? str1 : str2; 
} 

public string GetShortestString(string str1, string str2) 
{ 
    return str1.Length > str2.Length ? str2 : str1; 
} 

string longestString = GetLongestString(string1, string2); 
string shortestString = GetShortestString(string1, string2); 

Và tái sử dụng nó bất cứ khi nào bạn muốn!

Heck, làm cho nó thậm chí còn mát hơn (trong chế độ co-op với Tim);

public IEnumerable<string> GetLongestStrings(params string[] strings) 
{ 
    //returns first string with largest length out of given argumenst 
    int maxSize = strings.Max(str => str.Length); 
    return strings.Where(s => s.Length == maxSize); 
} 

public IEnumerable<string> GetShortestStrings(params string[] strings) 
{ 
    //returns first string with shortest length out of given arguments 
    int minSize = strings.Min(str => str.Length); 
    return strings.Where(s => s.Length == minSize); 
} 

Cách sử dụng;

string longestString = GetLongestStrings("str1", "str2", /*...*/ "strN").FirstOrDefault(); 

EDIT1: Triển khai đầu tiên của tôi không hiệu quả nhất. Như Tim đã đề nghị;

public string GetLongestString(params string[] strings) 
{ 
    return strings.OrderBy(s => s.Length).First(); 
} 

public string GetShortestString(params string[] strings) 
{ 
    return strings.OrderByDescending(s => s.Length).First(); 
} 

Cách sử dụng;

string longestString = GetLongestString("str1", "str2", /*...*/ "strN"); 
+1

Tôi nghĩ đây là câu trả lời hay nhất – dotctor

+0

Nhưng điều này liệt kê các chuỗi hai lần. Một lần để xác định min-/max-length và một lần để tìm chuỗi với chiều dài đó. Bạn chỉ có thể sử dụng 'strings.OrderBy (s => s.Length). Đầu tiên()' –

+0

@TimSchmelter thực sự. 'OrderBy' sẽ là một lựa chọn tốt hơn, nhưng kể từ khi bạn cung cấp rằng trong câu trả lời của bạn, tôi sẽ không mất tín dụng cho nó. –

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