2016-11-04 5 views
0

ctextというコンマで区切られた文字列があり、これを分割してList<string>に入れたいと思います。 LINQを使用してこの場合、AddRange()はToList()より速いでしょうか?

なり、

List<string> f = ctext.Split(',').ToList(); 

は、LINQを使用していないよりも遅くなりますか?

List<string> f; 
f.AddRange(ctext.Split(',')); 

AddRange()だけで、一度リストのサイズを確認し、それを展開し、それをダンプします一方、LINQは、実際に、それは遅くなるだろういくつかの点でどこかに何かをコピーするだろうと思えますかもっと速い方法がありますか? AddRange()が一度だけリストのサイズをチェックするのに対し、LINQは、実際に、それは遅くなるだろういくつかの点でどこかに何かをコピーするだろうと思える(私はそれを疑うが、、 forループを使用して同様。)

+1

これらは唯一の理由は何ですか? '新しいリスト(ctext.Split( '、'))'はどうでしょうか? –

+2

'ToList'と' AddRange'の両方がコピーを作成します。どちらが速いのかを知りたければ、それらを実行して測定してください。 –

+0

@Dスタンレーを実行します。 – skwear

答えて

6

幸いなことに、ToListはオープ​​ンソースであることがわかりました。 (最新のソースへのリンクに従ってください...)

私は前にIListProvider<T>を見たことがありませんが、配列が実装されているとは思えません。つまり、基本的にはnew List<TSource>(source)です。 List<T>ソースを見ると、コンストラクタとAddRangeの両方が基本的にCopyToを使用することになります。

つまり、いくつかのレベルの間接化を除いて、私は両方とも同じことをすると思います。

+0

Githubのソースコードは、referencesource.microsoft.comに掲載されているものと同じであるか、信頼性の面で優先順位があります。 –

+0

@名無し:私は確かに分かりません。私はちょうどgithubをナビゲートすることに精通しています。 –

+0

情報ありがとう –

3

それを展開してダンプしてください。

これらのことは起こっていますが、それぞれがその1つの操作に固有のものであると考えるのは間違いです。 ToListAddRangeの両方がこれらの両方を行います。どちらの操作でも、入力シーケンスのすべての値がリストにコピーされます。両方のアイテムが同時に複数のアイテムを追加しているため、リストの内部容量をどれだけ拡張するかを見ることができます。複数の拡張を実行する必要があります。

関連する問題