2011-06-29 16 views

答えて

37

しかし、のような何かを行うに少しきれいになり、はるかに効率的ではありません。

var strings = new string[] { "1", "02", "003", "0004", "00005" }; 

string longest = strings.OrderByDescending(s => s.Length).First(); 

出力:00005

+0

素晴らしい!ありがとう、私はFirstOrDefault()を使用しています。確かにきれいに見えますが、パフォーマンス面では何か利点はありますか? – vrrathod

+0

@vrrathodパフォーマンスの向上はありません。これまでと同じ反復ロジックを実行していますが、これはLINQの概要である簡潔な構文です。 –

+0

それは確かに同じことをします。ここで私はどのようにテストしたのですか?私は5000文字列の配列を生成しました。 LINQは私のマシンで約15 cpuのダニを取る。私は文字列の長さを比較する古きよきループを書いた。それは0ティックで返されます。 diffの推測は並べ替えのためのものです。 – vrrathod

9
string [] strings; 
return strings.OrderByDescending (s => s.Length).First(); 
2
string[] arr = new string[] { "a", "aa", "aaa" }; 

var longest = arr.Where(s => s.Length == arr.Max(m => m.Length)).First(); 

出力aaa

このようにして、コードは明らかに最大長の文字列を取得しています。

+0

これは確実に機能します。しかし、それはO(N^2)なので、他の答えよりも少し時間がかかります。例:私のマシンで約15のCPUティックで返されますが、これは約390のチックになります。 – vrrathod

+0

はい、私はこれを実現します。私は注文の副作用を使用するのではなく、何をしているかを述べているので、それを置いています。 –

-1

私は現在コンパイラを持っていませんが、これも動作します。

string[] arr = new string[] { "a", "aa", "aaa" }; 
var longest = arr.Max(w => w.Length) 
+1

これは、文字列自体ではなく、最大の長さを検索します。 – Vache

9
strings.Aggregate(string.Empty, (seed, f) => f.Length > seed.Length ? f : seed); 

集計構文は、他の方法より読み少し難しいですが、厳密に言えば、それはソートを必要としないように私はここを参照してください他の方法よりも効率的です。ちょうどO(N)の実装。

EDIT:このアプローチでは、他のほとんどの場合と同様に、f.Lengthがnull ref例外をスローしないように、リストにnull値が存在しないと想定しています。クイック三項演算子(f!= null?f.Length:0)は、それがあなたの列挙体に対して有効であった場合にそれを修正します。

+0

私はそれが確かに質問*と*答えたので、この答えを好む*と*私はそれが最も長い単語の全体のリストが必要とされていないときに単一の項目の答えのために最も効率的だと信じて*文字列も。私から2つの親指!便宜上、ここではうまく機能するコードをテストしました: 'string longest = strings.Aggregate(string。空、(seed、f)=>(f == null?0:f.Length)> seed.Length? f:種子); ' –

2

これは古い質問ですが、最も効率的な回答は提供されていないと付け加えたいと思います。これは1つのライナーではありませんが、OrderByまたはAggregateが提供しない最長のストリングのコレクションを返します。 Matt Ellenは答えに一番近いが、MaxのWhereでMaxを使用すると、大規模なコレクションを扱うときにはかなり遅くなる。

正しい答えは次のようになります。

int maxLength = collection.Max(x => x.Length); 
string[] longestStrings = collection.Where(x => x.Length == maxLength); 

が使用することを検討してください?。 (C#6.0では)と??あなたのコレクションにこれらを含めることができる場合、演算子はnull値をチェックします。

+1

訂正:質問は、最長の文字列のリストではなく、1つの文字列を求めます。また、最後のセミコロンをコンパイルする前に '.ToArray() 'が必要です。しかし、私はあなたのコードの最後に単純な '.FirstOrDefault()' vs '.ToArray()'を付けて、最も長い単語または最初の単語のリストを提供するために簡単に使用できるコードを提供することを勧めます。個人的に私はこのソリューションの柔軟性を好むので、私はあなたのソリューションが提供するものに最も似ています。ありがとう! –

関連する問題