var sortedAddr = listAddr.OrderBy(x => x.Address.Length);
var longestAddr = sortedAddr.Last();
var shortedAddr = sortedAddr.First();
现在,如果longestaddr
包含多个长度相同的记录,则上面的代码只打印一个。但是如何打印多个最长的地址?
答案 0 :(得分:1)
您可以获取最长地址的长度并使用TakeWhile
var sortedDesc = listAddr.OrderByDescending(x => x.Address.Length);
int longestAddress = sortedDesc.First().Address.Length;
var longest = sortedDesc.TakeWhile(x => x.Address.Length == longestAddress);
或者,您可以按地址长度进行分组,然后获取“最大”的组:
var longest = listAddr.GroupBy(x => x.Address.Length)
.Max(grp => grp.Key);
编辑:要打印出来,您可以循环访问最大地址集合:
foreach(var address in longest.Select(x => x.Address))
{
System.Console.WriteLine("Address: {0}, length: {1}", address, address.Length);
}
答案 1 :(得分:0)
我可能会从以下代码开始。
var minLength = listAddr.Min(y => y.Address.Length);
var maxLength = listAddr.Max(y => y.Address.Length);
var shortestAddr = listAddr.Where(x => x.Address.Length == minLength);
var longestAddr = listAddr.Where(x => x.Address.Length == maxLength);
它只包含一个优化 - 预先计算最小和最大长度,使运行时保持线性而不是变为二次。
对列表进行预排序至少需要O(n log(n))
,并且您只需在这次昂贵的操作后访问它几次。您当然可以这样做并使用Where()
或TakeWhile()
来获取所需的地址,但这会使代码更难以阅读,甚至可能更慢。