2011-12-06 13 views
2

これらの方法の中で最も効率的な方法はどれですか?文字列の最初の文字を判別する最も効率的な方法は?

this.returnList[i].Title[0].ToString() 

または

this.returnList[i].Title.Substring(0, 1) 
+11

重要ですか?パフォーマンスに問題がありますか?ベンチマークは何を言ったのですか? – Oded

+0

あなたのコードを読んで読んだときに、私はあなたに最も合ったものを使います。 – hspain

+0

あなたが好奇心をそそり、公正であれば、それは簡単に測定できます。 – codekaizen

答えて

3

彼らは非常に速く、両方のだ:

チャーインデックス

var sample = "sample"; 
var clock = new Stopwatch(); 
for (var i = 0; i < 10; i++) 
{ 
    clock.Start(); 
    for (var j = 0; j < 10000000; j++) 
    { 
     var first = sample[0].ToString(); 
    } 
    clock.Stop(); 
    Console.Write(clock.Elapsed); 
    clock.Reset(); 
} 

// Results 
00:00:00.2012243 
00:00:00.2207168 
00:00:00.2184807 
00:00:00.2258847 
00:00:00.2296456 
00:00:00.2261465 
00:00:00.2120131 
00:00:00.2221702 
00:00:00.2346083 
00:00:00.2330840 

サブストリング

var sample = "sample"; 
var clock = new Stopwatch(); 
for (var i = 0; i < 10; i++) 
{ 
    clock.Start(); 
    for (var j = 0; j < 10000000; j++) 
    { 
     var first = sample.Substring(0, 1); 
    } 
    clock.Stop(); 
    Console.Write(clock.Elapsed); 
    clock.Reset(); 
} 

// Results 
00:00:00.3268155 
00:00:00.3337077 
00:00:00.3439908 
00:00:00.3273090 
00:00:00.3380794 
00:00:00.3400650 
00:00:00.3280275 
00:00:00.3333719 
00:00:00.3295982 
00:00:00.3368425 

私もchar型のインデックスを使用すると、きれいな方法であることをBrokenGlassに同意しますそれを書いているのです。さらに10兆倍の時間を費やしていると、はるかに速くなります!

+0

そのような明確な方法で違いを説明していただきありがとうございます! – slinzerthegod

+1

@slinzerthegod問題ありません。ダウンロードLINQPad http://www.linqpad.net/それは自由で絶対に不可欠です。 C#コードを素早く簡単に試してテストすることができます。また、あなたの質問に満足して答えた場合は、必ず回答を確認してください。 –

1
私はそれが賢明ずっと効率が重要でだろうが、最初の文字を返す私の意見では明確に、より多くの慣用的なので、より保守の方法は、インデックスを使用しているとは思わない

オペレータ:それはあなたがそれをチェックする必要が与えられない場合

char c = returnList[i].Title[0]; 

これは当然の前提として少なくとも一つの文字が、そこにあります。

0

これらはパフォーマンスがほぼ同じである必要があります。

操作の高価な部分は文字列を作成することであり、効率的な方法はありません。

可能であれば、すべての可能な文字の文字列を事前に作成して辞書に格納したいが、そのような簡単な作業には大量のメモリが必要になる。

0

returnList[I].Title[0]は、新しいstringを作成する必要がなく、元の文字からの文字にのみアクセスするので、はるかに高速です。 もちろん、文字列が空の場合は例外がスローされるため、最初にチェックする必要があります。

大まかには、固定長1の文字列を使用しないでください。つまり、charが対象です。

性能の差は問題にはならないが、確かに読みやすさは向上します。

+0

実際には、文字列を文字列に戻すときに、新しい文字列を作成する必要があります。 ( 'char.ToString()') –

+0

@Charles、文字列を比較するのはなぜですか? 'returnList [I] .Title [0] = 'A'c' –

+0

@Charles:なぜcharを文字列に変換したいのですか?固定長の1文字列を渡しても意味がありません。 – Falanwe

2

「最初の文字」が意味するものと、それに含まれるものに応じて、問題の原因となる大きな抜け穴があります。returnList

C#の文字列は、UTF-16、可変長符号化され、そしてreturnListは、文字列の配列である場合、returnList[i]のみユニコード点の一つcharかもしれない含みます。あなたは、文字列の最初のUnicode書記戻したい場合は、次の

string s = returnList[i].Title; 
if (string.IsNullOrEmpty(s)) 
    return s; 

int charsInGlyph = char.IsSurrogatePair(s, 0) ? 2 : 1; 
return s.Substring(0, charsInGlyph); 

をあなたは部品表、タグ付き、および結合文字と同じ問題に実行することができます。これらはすべて有効な文字ですが、ユーザーに表示された場合は意味がありません。

文字ではなく、Unicodeポイントまたはグラフェンを使用する場合は、文字列を使用する必要があります。 Unicode書記素は複数の文字にすることができます。

関連する問題