web-dev-qa-db-ja.com

LINQを使用してstring []内で最長の文字列を見つける方法

可変長の文字列の配列があります。現在、配列を反復処理して配列内で最長の文字列を見つけるループがあります。 LINQを使用してより効率的および/またはよりクリーンな方法でそれを書くことができる方法はありますか?

19
vrrathod

それほど効率的ではありませんが、次のようなことを行うと少しクリーンになります。

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

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

出力:00005

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

集計構文は他の方法よりも少し読みにくいですが、厳密に言えば、ソートを必要としないため、ここで見た他のアプローチよりも効率的です。ただO(N)実装。

編集:このアプローチは、ここにある他のほとんどのアプローチと同様に、f.Lengthがnull ref例外をスローしないように、リストにnull値がないことを前提としています。簡単な三項演算子(f!= null?f.Length:0)は、列挙可能オブジェクトに対して有効である場合に修正します。

13
Caleb Holt
string [] strings;
return strings.OrderByDescending (s => s.Length).First ();
9
agent-j
string[] arr = new string[] { "a", "aa", "aaa" };

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

出力aaa

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

2
Matt Ellen

これは古い質問ですが、最も効率的な答えが提供されていないことを付け加えたいと思います。ワンライナーではありませんが、最も高速で、OrderByまたはAggregateが提供しない最長の文字列のコレクションを返します。 Matt Ellenが彼の答えに最も近いものでしたが、彼のWhere内でMaxを使用すると、大規模なコレクションで作業しているときにかなり遅くなります。

正解は次のとおりです。

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

?の使用を検討してください。 (C#6.0)および??コレクションにnull値を含めることができる場合は、演算子を使用してnull値を確認します。

2
anthonytimmers