var sortedAddr = listAddr.OrderBy(x => x.Address.Length);
var longestAddr = sortedAddr.Last();
var shortedAddr = sortedAddr.First();
現在,如果longestaddr
包含一個以上的記錄有相同的長度,上面這段代碼打印只有一個。但是如何打印多個最長的地址?如何採取一個以上符合條件的記錄
var sortedAddr = listAddr.OrderBy(x => x.Address.Length);
var longestAddr = sortedAddr.Last();
var shortedAddr = sortedAddr.First();
現在,如果longestaddr
包含一個以上的記錄有相同的長度,上面這段代碼打印只有一個。但是如何打印多個最長的地址?如何採取一個以上符合條件的記錄
我可能會從下面的代碼開始。
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()
來獲得所需的地址,但這會使代碼更難以閱讀,甚至可能更慢。
你可以得到最長的地址的長度和使用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);
}
謝謝lee..anyway以最短的代碼打印地址的長度以及地址的同時嗎? – Jasl 2010-07-05 10:00:22