Получите самую длинную и короткую строку эстетичным способом

В моем коде есть следующие строки. Они занимают больше места, чем должны. Любые предложения для меньшего кода.

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

Я знаю, не очень важный вопрос, но это занимает 2/3 всего метода, а не важный материал.

Ответ 1

Может быть:

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

Но если у вас есть больше, чем эти две строки, и вы хотите использовать общее решение, которое вы могли бы использовать:

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

Ответ 2

Поскольку ваш код всегда будет выполнять либо путь if, либо другой, выберите его как "по умолчанию" и объедините его с объявлением переменной:

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

Бонусные баллы за то, что вы фактически инициализируете эти переменные.

Ответ 3

Ну, вы можете сделать это, чтобы очистить свой метод вверх;

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);

И повторно используйте его, когда захотите!

Черт, сделайте его еще более холодным (в кооперативном режиме с Тимом);

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);
}

Использование

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

EDIT1: Моя первая реализация не самая эффективная. Как предложил Тим,

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();
}

Использование

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

Ответ 4

Вы можете использовать оператор "?:"

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