Одним из способов были бы сделать это
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 и конвертируйте ее в режим максимальной функции, а затем конвертируйте обратно, чтобы получить максимальную строку.
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));
Это может не иметь нулевые чеки, но вы легко можете добавить их в.
Ваша проблема в том, что если отсортирован в алфавитном, d10a10 приходит первым, потому что 1 сортируется перед тем 9. Если d4a13 отсортирован перед оба они по вашей логике? –
является первой частью идентификатора всегда «d10a»? – Tsar
Прежде всего, длина важна x1 доходит до a10, вторая может быть любой комбинацией, нет префикса, такого как d10a –