5

これらの2つは正確なことをしているようです。私はそれらの時間を計りました-これは小さな例であることを知っています-しかし、それらもまったく同じ速度で実行されているようです。どちらか一方を使用する利点はありますか?

List<string> alpha = new List<string>(new string[] { "a", "b", "c" });
foreach (var letter in alpha)
{
    Console.WriteLine(letter);
}

IEnumerable<string> _alpha = new[] {"a", "b", "c"};
foreach(var _letter in _alpha)
{
     Console.WriteLine(_letter);
}
4

5 に答える 5

4

IEnumerable<string>インターフェースです。List<string>そのインターフェースを実装するクラスです。

インターフェイスは、そのインターフェイスを実装するクラスが実装する必要のある機能を定義するだけです。

クラスは、その機能を実際に実装する責任があります。

あなたのテストは実際にaList<string>とaを反復する速度をテストしていstring[]ます。サンプルのサイズが小さく、List<string>クラスの内部の仕組みがわかっているので、実際には違いは見られないはずです。

于 2012-05-09T19:53:48.623 に答える
1

あなたの例に関しては、実行速度と最終結果(特に3つの項目のみ)に関しては実際の違いはありません。

IEnumerable<T>インターフェースList<T>あり、このインターフェースを実装する実際のクラスです。

于 2012-05-09T19:53:57.747 に答える
1

あなたの例は実際にと比較List<string>していstring[]ます。これらのタイプは両方とも、タイプの動作IEnumerable<string>を指定する単なるインターフェースであるを実装します。

タイプ自体に関しては、主な違いは、List<string>必要に応じてサイズを変更できることです(ほとんどの場合、固定長ではありません)が、string[]作成時に長さを指定する必要があり、サイズを変更することはできません。それぞれのパフォーマンスは後から考える必要があります。

あなたの例は、まったく同じ意味で、次のように書くこともできます。

IEnumerable<string> alpha = new List<string>(new string[] { "a", "b", "c" });
foreach (var letter in alpha)
{
    Console.WriteLine(letter);
}

IEnumerable<string> _alpha = new[] {"a", "b", "c"};
foreach(var _letter in _alpha)
{
    Console.WriteLine(_letter);
}
于 2012-05-09T19:55:58.573 に答える
1

これらは異なるタイプのオブジェクトであり、実際のクラスであるのIEnumerableに対し、インターフェイス(インスタンス自体ではなく、一部の機能のスキーマ)です。List

どちらか一方を使用することには、ある種の「利点」があります。

より柔軟にしたいメソッドを作成していて、オブジェクトを列挙するだけでよい場合は、を使用しますIEnumerable

Listを実装し、、および他の多くのクラスとIEnumerable同様に、そのように扱うことができます。Collection

これを例に取ってください:

public void OutputEnumerable(IEnumerable<string> strings)
{
    foreach (string s in strings)
        Console.WriteLine(s);
}

public void OutputList(List<string> strings)
{
    foreach (string s in strings)
        Console.WriteLine(s);
}

次に、このデータがあります。

List<string> stringList = new List<string>(new [] { "a", "b", "c" });
Collection<string> stringCol = new Collection<string>(new [] { "a", "b", "c" });
IEnumerable<string> stringEn = new [] { "a", "b", "c" };

これらはすべて機能します:

OutputEnumerable(stringList);
OutputEnumerable(stringCol);
OutputEnumerable(stringEn);
OutputList(stringList);

そして、これらはしません:

OutputList(stringCol);
OutputList(stringEn);
于 2012-05-09T19:56:12.910 に答える
1

List<string>は、、、などAddのさまざまなメソッドを持つ要素コレクションの具体的な実装です。すべての要素がすでにメモリにあり、インデクサーを介してランダムにアクセスできます。RemoveSort

IEnumerable<string>forは、ループまたはGetEnumerator()メソッドを使用して列挙できる文字列のシーケンスを定義するインターフェイスです。リストなどの要素を操作する追加のメソッドは含まれていません。また、要素はメモリに保存されない場合がありますが、一度に1つずつソースから取得されます。

于 2012-05-09T19:59:30.963 に答える