web-dev-qa-db-ja.com

c#配列とジェネリックリスト

基本的に、下記のシナリオで配列の代わりに一般的なリストを使用することの違いまたは利点を知りたい

class Employee
{
    private string _empName;

    public string EmpName
    {
       get{ return _empName; }
       set{ _empName = value; }
    }
}

1. Employee[] emp 
2. List<Employee> emp

誰もが私に長所と短所を教えてくれますか、どちらを好むのですか?

32
L G

1つの大きな違いは、List<Employee>は拡張可能(その上でAddを呼び出すことができます)または縮小可能(その上でRemoveを呼び出すことができます)ですが、Employee []はサイズが固定されています。したがって、Employee[]必要性がない限り、作業はより困難です。

20
Thomas

最大の違いは、一度作成された配列は長くも短くもできないことです。リストインスタンスは、要素を追加または削除できます。他にも差分があります(たとえば、使用できるメソッドのセットが異なります)が、追加/削除が大きな違いです。

配列を使用する正当な理由がない限り、Listが好きです。Listの柔軟性は高く、パフォーマンスのペナルティは、コードが通常実行している他のほとんどのコストと比べて非常に小さいためです。

多くの興味深い技術的な詳細に飛び込みたい場合は、 このStackOverflowスレッド をチェックしてください。これは、リストと配列の質問をより深く掘り下げています。

15
Justin Grant

一般的なリストを使用すると、Add/Removeなどを安価に(少なくとも遠端で)行うことができます。アレイのサイズ変更(追加/削除のため)の方がコストがかかります。明らかな欠点は、リストに予備の容量があるため、数バイトを浪費する可能性があることです。

一般に、knowデータがサイズを変更しない限り、リストを優先します。

APIに関しては、LINQはそれらの間で選択するものはほとんどないためです(つまり、List<T>の追加メソッドはLINQによって主に複製されるため、配列はそれらを無料で取得します)。

別の利点は、リストを使用するとセッターを公開する必要がないことです。

private readonly List<Foo> items = new List<Foo>();
public List<Foo> Items { get { return items; } }

nullバグの範囲を排除し、データの制御を維持できるようにします(特に、内容を変更するときに検査/検証をサポートする別のIList<>実装を使用する場合)。

7
Marc Gravell

作成時に配列のサイズを知る必要がありますが、作成後に配列のサイズを変更することはできません。

そのため、作成時に配列の動的メモリ割り当てを使用します。 (これは、コンパイル時にサイズがわかっている必要があるC++配列で使用される静的メモリ割り当てとは異なります。)

リストは作成された後、動的に大きくなる可能性があり、それを行うための.Add()関数があります。

-MSDNから

  1. Generics Vs Array Lists-SO 一般的な比較。
  2. 汎用リストvs配列-SO 汎用リストが配列より遅いのはなぜですか?

どちらを選びますか? List<T>

2
Pratik Deoghare

パブリックインターフェイスでコレクションを公開する場合、.NET Frameworkガイドラインでは、T []ではなくListを使用することをお勧めします。 (実際には、BindingList <T>)

内部的には、既知の固定サイズのコレクションがある場合は、配列の方が適しています。配列のサイズを変更すると、リストの最後に要素を追加するのに比べてコストがかかります。

2
Mitch Wheat

要素の数がわかっている場合は、配列を選択することをお勧めします。リストを使用しない場合。内部的にList<T>はTの配列を使用するので、実際にはあなたが思っているよりも似ています。

1
Brian Rasmussen

リストを使用すると、事前に配列のサイズを知る必要はありません。実装のニーズに基づいて、新しい従業員を動的に追加できます。

1
mheathershaw