最短元素我有一個數組查找陣列
string[] names = { "Jim Rand", "Barry Williams", "Nicole Dyne", "Peter Levitt", "Jane Jones", "Cathy Hortings"};
有沒有辦法找到它是在一個不同的數組元素的數組,然後存儲休息最短(長智)元素。
感謝, 安仁
最短元素我有一個數組查找陣列
string[] names = { "Jim Rand", "Barry Williams", "Nicole Dyne", "Peter Levitt", "Jane Jones", "Cathy Hortings"};
有沒有辦法找到它是在一個不同的數組元素的數組,然後存儲休息最短(長智)元素。
感謝, 安仁
var orderedNames = names.OrderBy(name => name.Length);
string shortestName = orderedNames.First();
string[] otherNames = orderedNames.Skip(1).ToArray();
非常感謝..這工作...你的幫助讚賞... – Ani 2010-04-21 07:54:32
請注意,這將是大型陣列效率低下;對數組進行排序需要進行O(n lg n)比較。有一個算法來解決這個問題,即O(n)。我還注意到,您在解決方案中將列表*兩次排序。調用First()命令列表。調用Skip *重新排列原始列表*。請記住,LINQ不知道你在另一個線程之間沒有改變這些調用的「名字」;答案可能會有所不同,因此結果必須重新計算。 – 2010-04-21 14:17:27
@Eric Lippert:是的,好點。在原始任務中將'.ToList()'添加到'orderedNames'應該解決最後一個問題,對吧? – 2010-04-21 14:41:46
在C#中的.Net 3.5:
string shortestName = names.Aggregate((n1, n2)=>n1.Length<n2.Length?n1:n2);
這是你可以存儲其他元素在其他陣列
var otherArrays = names.Exclude(new List<string>(){shortestName});
沒有.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的的技術還遠遠更好,因爲它更易於閱讀!沒有獎勵積分編寫最複雜的答案......大聲笑
你使用什麼語言? – ereOn 2010-04-21 07:48:43
@ereOn:語法似乎是C#。但是,語言標籤肯定比任何當前的標籤更受歡迎。 – 2010-04-21 07:50:39
@ereOn:標籤上寫着「C#」 – Nayan 2010-04-21 08:22:20