からの放棄の使用の配列クライアントまで、フルのC#?
質問
プログラムを組んでてきたと言われてい追加要素を配列に起こるようになります:
空の配列のコピーに対し+1elementは 作成され、その後のデータからの 独自の配列にコピーして 新しいデータのための新しい要素は そしてロード
このような場合は、配列内のシナリオを入れることによって行われる多くの要素活性は逆に示により、リソースメモリやCPUなどを利用して正しいですか。
なお、この場合には、なごみを利用するのは避ける配列などを可能にするには、以下の方法がありますさを追加する多くの要素?を起用すべきiStringMapょうか?その場合、何が必要な場合は二つ以上の寸法を追加する必要があり多くの要素を追加.いあなただけのパフォーマンスはもうすべきは何に使われるのでしょうか。
解決
の一般 List<T>
代替として、arrays.これらの同じものを配列を含む配当初の保管サイズます。
他のヒント
この内容によって何を意味"を追加。"
の場合とは、次のものをいう。
T[] array;
int i;
T value;
...
if (i >= 0 && i <= array.Length)
array[i] = value;
そして、この新規作成しません配列しやすさに違いがありますが、実は最速の方法の変更などのIListます。います。
ただし、ご利用中のようなものArrayList、リスト、行っています。その呼び出しの追加方法 月 新しい配列を作成しないスマートいわけではないサイズの変更による1素子育ててい幾何学的な場合を追加した多くの価値観たがって割り当てを新しい配列の型になります。その後も使用できる"能力"プロパティの力で成長する前に、わかればどのように多くの要素を追加した(list.Capacity += numberOfAddedElements
)
一般に、もう配列ます。を使えば一覧<T>.では、動的にサイズの配列内にあるのは、ほとんど。使用している場合は、多次元配列の場合は、利用一覧<List<List<T>>>ただいてます。なることもないのメモリが簡単になりに追加項目です。
だが、0.1%の使用を必要とする極めて迅速でくださいこの商品につけられたリストにアクセスが本当の問題を前にして最適です。
まねきの追加取り付けたり取り外したりする要素が多く、使用、リストを作成します。場での多次元を利用できることが一覧<List<int>>あります。
一方、リストの少ない効率的に配列さいほうが 横行 のリストが配列がすべて一箇所におCPUキャッシュには、オブジェクトリストが点在する。
を利用する場合は配列を効率的に読みがえる"に加え"要素を頻繁には、主に二つのオプション:
1)生としてリスト(またはリストのリストおよびその利用ToArray()を効率的な配列です。
2)配分の配列を大きくするのではなくはあなたが必要とするよりも、このオブジェクトを事前に割り当てられた細胞。場合の必要なもの要素よりも前に割り当てできるため、再配分の配列で充填用コスト率のサイズ。これはO(log n)のリサイズの性能ではなくO(n)のようなことを再配分-再配追加配列になります。ことに注意してはいかがStringBuilderの作品は、より早い方を継続的に追加する文字列です。
時の放棄の使用の配列
第一に、 が意味の配列 ゴ 合意思 が必要となります動的に成長。セットにな重複を許可?るコレクションには変更でき?を避ける配列である。その99%である。で記載、あなたが基本です。
第二に、 き ない 符号化のための絶対性能criticalness その約95%である。 配列にはどのように絡んでいるのかを 幅, 特に繰り返し.することはほとんどいない。
きん ない 強制による引数
params
キーワード -だっparams
受け入れずIEnumerable<T>
でも、言語の構築そのものを表示 配列 な枠組みタイプ)です。き ない 書くレガシーコード、または対応interop
でも希少ないが必要な配列になります。を追加します理由としては、月一回避のですか?
最大の理由な配列imoは、概念.配列に近い実施、遠くから可能です。配列伝える。 であること 以上 プロセスとは切り離されているた の精神の高レベルの言語である。これは驚くべきことではない、アレイにより近い金属、その特殊なタイプが内部的に配列はクラス)な教育が列んで言葉の意味の意味は非常についてはほとんどが必要です。最も役に立つと頻繁に意味ある資料を他のエントリを設定する個別項目のキー値マップなどと組み合わせの追加可能,読み取り専用になり,不変なので、秩序を尊重しに変更されることもあります。考えていただきたいところが希望しているのだから追加可能、コレクションや読み取り専用コレクションの定義済みの品目に変更がしばしばあなたのロジックのように見えいただくために動的に追加可能回収が一定数については変更可能からそう遠くないところ?非常に珍しょうか。
配列設計された前のジェネリック医薬品の時代かを模したgenericity多くの時hacksで、その奇妙だけではないことを知りました。一部の漁獲物から:
-
string[] strings = ... object[] objects = strings; objects[0] = 1; //compiles, but gives a runtime exception.
配列が参照するstruct!.ことになるとは異なります。サンプル:
struct Value { public int mutable; } var array = new[] { new Value() }; array[0].mutable = 1; //<-- compiles ! //a List<Value>[0].mutable = 1; doesnt compile since editing a copy makes no sense print array[0].mutable // 1, expected or unexpected? confusing surely
実行時間の実施方法など
ICollection<T>.Contains
で異なる構造体および授業.での対応も忘れてしまった場合は、をオーバーライド 非一般Equals
正しい参照型を期待汎用コレクションを探す 汎用Equals
, を取得しま誤った。public class Class : IEquatable<Class> { public bool Equals(Class other) { Console.WriteLine("generic"); return true; } public override bool Equals(object obj) { Console.WriteLine("non generic"); return true; } } public struct Struct : IEquatable<Struct> { public bool Equals(Struct other) { Console.WriteLine("generic"); return true; } public override bool Equals(object obj) { Console.WriteLine("non generic"); return true; } } class[].Contains(test); //prints "non generic" struct[].Contains(test); //prints "generic"
の
Length
財産[]
indexerにT[]
そうすると通常の特性をできるアクセスを通じて反射るならでは一部のマジック)が、付き合いを表現で木のまま吐き出し、正確な同じコードをコンパイラます。がありArrayLength
やArrayIndex
方法でいます。その一つ 問合せ内容.別の例:Expression<Func<string>> e = () => new[] { "a" }[0]; //e.Body.NodeType == ExpressionType.ArrayIndex Expression<Func<string>> e = () => new List<string>() { "a" }[0]; //e.Body.NodeType == ExpressionType.Call;
-
どの放棄の使用の配列
最も一般的に使用を代替する List<T>
る洗浄します。では、動的に成長構造のことを付け加えることができます、 List<T>
の末尾に挿入し、ここに載の容量です。に勝るものはありませんし、正確な行の配列が人々にどんな配列として読み取り専用回収ができないのは何も付加。代替は ReadOnlyCollection<T>
.私はこの拡張方法
public ReadOnlyCollection<T> ToReadOnlyCollection<T>(IEnumerable<T> source)
{
return source.ToList().AsReadOnly();
}
の配列がサイズ変更は、新しい配列を割り当てる必要があり、内容がコピーされます。の場合のみ変更の内容は、配列のできるメモリ割りになります。
なので、利用するべきではありません配列が分からないときのサイズ配列のサイズが変化します。ただし、固定長配列を、手軽に行うことができ取の要素のインデックスコンサルティング.
ArrayListリストの配列以上が必要である(と思っている倍のサイズ、がんを確認する彼らは一般的に最良の選択肢がする動的にサイズの配列になります。
がベンチマークを示す配列内のリサイズが大きく鈍化申請に注意してください)-早期の最適化の根源悪)を評価でき書面のカスタム配列クラスとの調整サイズ変更ます。
一般的になければならない最高のクルックアップ性能での構築リストの最初の下までお問い合わせください配列が支払う小さな罰則が回避す。場合には問題は、そのまま継続的に新しいデータを除去し古いデータを使用する場合がありましArrayListまたはリストのための利便性がいいだけの特別な場合をArrays.が"成長"させて配置する全く新しい配列のコピーをすべてでは非常に遅くなります。
ArrayList は配列で成長する必要があります。フォッパゴンドラリフトとラーク償O(1)、注意するかどうかを確認するためにリサイズすることができな時は悪い。挿入はO(n)はすべての項目を右に動かさなければならない。削除するにはO(n)すべての項目を右に動かさなければならない。
も重要ということを考慮しておくリストではないリンク一覧です。だから入力ArrayList.リスト 文書 なりますのでご注意をより良い例だと言うわけではありません。はいかがでしょうか。
の最善のことは、データ構造の適切な問題です。これにより一つのものをいただいた方がよいと思います参照を行 システム。ョンにします。汎用 Namespace.
こういった場合でもキー値 辞書 する最良のベット。この挿入および削除する方法O(1)です。しかしそれでもなお辞書はいらないように注意してくださいのでリサイズで内部の配列(O(n)のサポートしない場合。でに多くの部屋の指定を大きくしまの期待が利用で初期容量のコンストラクタです。
-リック
標準の配列で定義され、埋蔵量のメモリが必要であると考える連続したブロックです。追加項目の配列に入れての内部ブロックをすでに予約済みます。
アレイによる複数の書き込み、多くの読み込みを中心に繰り返し自然に対してなんといっても、使用、その他多くのデータ構造です。
お正しい配列が見えます。しかしらの修正のサイズ配列の損害が大きくなる可能性がある。
のものを使用できるコンテナを支援する増分のサイズ調整は、シナリオがいの変更のサイズの配列になります。きるArrayListる設定をすることができ初期サイズできますが、常にチェックのサイズと比べ、容量およびその後の増分の大きなチャンクの数を制限サイズ.
ただけなのに用リンク一覧です。そしlookアップしてゆっくりと---
このフォーラムポストがないとする利用いた効率に関する様々な配列の種類:C#の配列-多次元vs際の字句
さっきの項目を追加するコレクションに多くその生涯を通して、また利用したいと思い、リストを作成します。てしまうというサイズのコレクションが宣言され、また利用したいと思います。
もう一般的配列に渡りリストであってコレクションとしてのオブジェクトのプロパティ-たくない呼び出し側の項目を追加することをコ経由でリストの追加方法がない項目を追加するには、集っているオブジェクトのインタフェース。その場合、または内部リストを呼び出ToArrayを返します。
合する必要がありますの追加 や ませてランダムアクセスなど myArray[i]
).き使用を考慮してリンクリストLinkedList<T>
とって"成長"のように List<T>
実装されます。だが、できるだけ本当にアクセス品 LinkedList<T>
を利用した実装に IEnumerable<T>
インタフェース。
のレストランのお食事価格はあなたができることは配分して記憶お客様のご要望に応じて先行が可能です。これを防止 .当期純 ることから上がっている電話をメモリーのヒープ.失敗が、それらのことは、あってはならないことで配分に読しやすい番号の意味があります。
この規則に応募することもできますありません。