2010-04-21 85 views
2

最短元素我有一個數組查找陣列

string[] names = { "Jim Rand", "Barry Williams", "Nicole Dyne", "Peter Levitt", "Jane Jones", "Cathy Hortings"}; 

有沒有辦法找到它是在一個不同的數組元素的數組,然後存儲休息最短(長智)元素。

感謝, 安仁

+2

你使用什麼語言? – ereOn 2010-04-21 07:48:43

+0

@ereOn:語法似乎是C#。但是,語言標籤肯定比任何當前的標籤更受歡迎。 – 2010-04-21 07:50:39

+0

@ereOn:標籤上寫着「C#」 – Nayan 2010-04-21 08:22:20

回答

9
var orderedNames = names.OrderBy(name => name.Length); 

string shortestName = orderedNames.First(); 

string[] otherNames = orderedNames.Skip(1).ToArray(); 
+0

非常感謝..這工作...你的幫助讚賞... – Ani 2010-04-21 07:54:32

+0

請注意,這將是大型陣列效率低下;對數組進行排序需要進行O(n lg n)比較。有一個算法來解決這個問題,即O(n)。我還注意到,您在解決方案中將列表*兩次排序。調用First()命令列表。調用Skip *重新排列原始列表*。請記住,LINQ不知道你在另一個線程之間沒有改變這些調用的「名字」;答案可能會有所不同,因此結果必須重新計算。 – 2010-04-21 14:17:27

+0

@Eric Lippert:是的,好點。在原始任務中將'.ToList()'添加到'orderedNames'應該解決最後一個問題,對吧? – 2010-04-21 14:41:46

2

在C#中的.Net 3.5:

string shortestName = names.Aggregate((n1, n2)=>n1.Length<n2.Length?n1:n2); 

這是你可以存儲其他元素在其他陣列

var otherArrays = names.Exclude(new List<string>(){shortestName}); 
+0

+1。我喜歡C#如何使這樣的事情變得如此簡單;)但是,您錯過了需要將其他元素存儲在數組中的問題的第二部分。 – ereOn 2010-04-21 07:49:11

+0

,給你最短的項目的長度,壽;它不告訴你哪個項目是 – 2010-04-21 07:49:11

+0

非常感謝,我是新的從未嘗試過這個代碼..我會嘗試...再次感謝 – Ani 2010-04-21 07:49:21

1

沒有.Exclude Array的方法(或擴展方法),他沒有說他想改變新陣列的集合類型。您使用.Aggregate是非常好的,所以讓我們再進一步,並使用.Aggregate來進行排除!

像這樣:

string shortestName = names.Aggregate((n1, n2) => n1.Length < n2.Length ? n1 : n2); 
string nonArrayString = names.Aggregate((n1, n2) => n2 != shortestName ? n1 + " " + n2 : n1); 
string[] newNames = nonArrayString.Split(' '); 

大衛Hedlund的的技術還遠遠更好,因爲它更易於閱讀!沒有獎勵積分編寫最複雜的答案......大聲笑