Одним из способов было бы сделать это
string max =lsd.Where(kvp=>kvp.Value.Length==lsd.Max(k=>k.Value.Length)).Max(kvp => kvp.Value);
, однако я думаю, что этот метод оценил бы максимальную длину для каждого элемента, поэтому вам может быть лучше сначала извлечь ее из переменной
int maxLength=lsd.Max(kvp=>kvp.Value.Length);
string max = lsd.Where(kvp=>kvp.Value.Length == maxLength).Max(kvp => kvp.Value);
Если у вас там будут нулевые строки, вам может потребоваться также выполнить нулевые проверки
int maxLength=lsd.Max(kvp=>(kvp.Value??String.Empty).Length);
string max = lsd.Where(kvp=>(kvp.Value??String.Empty).Length == maxLength).Max(kvp => kvp.Value);
В качестве альтернативы обработайте вашу строку как число Base36 и преобразуйте в long для функции max, а затем выполните обратное преобразование.снова, чтобы получить строку max.
string max =lsd.Max(tvp=>tvp.Value.FromBase36()).ToBase36();
public static class Base36 {
public static long FromBase36(this string src) {
return src.ToLower().Select(x=>(int)x<58 ? x-48 : x-87).Aggregate(0L,(s,x)=>s*36+x);
}
public static string ToBase36(this long src) {
StringBuilder result=new StringBuilder();
while(src>0) {
var digit=(int)(src % 36);
digit=(digit<10) ? digit+48 :digit+87;
result.Insert(0,(char)digit);
src=src / 36;
}
return result.ToString();
}
}
Наконец, просто метод расширения Agregate вместо Max, поскольку это позволяет вам выполнять всю логику сравнения ....
lsd.Agregate(string.Empty,(a,b)=> a.Length == b.Length ? (a>b ? a:b) : (a.Length>b.Length ? a:b));
Это можетне имеет нулевых проверок, но вы легко можете их добавить.