2010-07-05 70 views
0
var sortedAddr = listAddr.OrderBy(x => x.Address.Length); 

var longestAddr = sortedAddr.Last(); 
var shortedAddr = sortedAddr.First(); 

現在,如果longestaddr包含一個以上的記錄有相同的長度,上面這段代碼打印只有一個。但是如何打印多個最長的地址?如何採取一個以上符合條件的記錄

回答

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()來獲得所需的地址,但這會使代碼更難以閱讀,甚至可能更慢。

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

謝謝lee..anyway以最短的代碼打印地址的長度以及地址的同時嗎? – Jasl 2010-07-05 10:00:22

相關問題