これもできますが、以前の投稿も正しいようです。
for(int i = 0; i < pizzas.Count; i++)
Console.WriteLine(pizzas.ElementAt(i));
Console.ReadLine();
編集1:
明らかでない場合、必要な特定のインデックス (1) は次のようにアクセスされます。
string pizza = pizzas.ElementAt(1);
編集2:
欠陥のあるコード。編集3を参照してください。
編集3:
2 つの方法が与えられたので、それらをテストしてみましょう。
コード:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace ElementAtOrIndex
{
class Program
{
// Declare/initialize static variables.
static Stopwatch timer = new Stopwatch();
static List<long> ElementAtTimes = new List<long>();
static List<long> IndexTimes = new List<long>();
static void Main(string[] args)
{
// Declare/initialize variables.
int count = 100000;
int iterations = 1000;
// Just initializes a list with elements from 0 to count.
// Slower than for loops, but pithy for an example on SO.
List<int> list = Enumerable.Range(0, count).ToList<int>();
// Assert that both methods are equal.
for (int i = 0; i < list.Count; i++)
{
if (list.ElementAt(i) != list[i])
{
Console.WriteLine("Both methods are not equal!");
Environment.Exit(1);
}
}
Console.WriteLine("Both methods are equal!");
// Time ElementAt access *iterations* times by copying into a variable.
for (int i = 0; i < iterations; i++)
{
// [Re]start the timer.
timer.Reset();
timer.Start();
int temp;
for (int j = 0; j < list.Count; j++)
temp = list.ElementAt(j);
// Note the time.
ElementAtTimes.Add(timer.ElapsedTicks);
}
// Time Index access *iterations* times by copying into a variable.
for (int i = 0; i < iterations; i++)
{
// [Re]start the timer.
timer.Reset();
timer.Start();
int temp;
for (int j = 0; j < list.Count; j++)
temp = list[j];
// Note the time.
IndexTimes.Add(timer.ElapsedTicks);
}
// Output times.
Console.WriteLine("Average time for ElementAt access: {0} ns", ElementAtTimes.Average() / count * 100);
Console.WriteLine("Average time for Index access: {0} ns", IndexTimes.Average() / count * 100);
Console.ReadLine();
}
}
}
テスト:
http://goo.gl/Tf10R
出力:
Both methods are equal!
Average time for ElementAt access: 25.101014 ns
Average time for Index access: 12.961065 ns
コメント:
エラーに関しては、MSDN のドキュメントと豊富な経験的証拠は、そのような懸念がまったく根拠のないものであることを示唆しています。リストが変更された場合、もちろん、それらの変更は両方のアクセス方法に反映されます。
インデックス アクセス方法は間違いなく*高速ですが、どれだけ軽視したいのですか。10万アクセスのタイミングです。アクセスごとに、わずか数ナノ秒高速です。それは最終的に加算されますが、ほとんどのアプリケーションにとって不要な最適化であり、両方の方法が文字通り同じことをすることになります。
また、これは int 型の List へのアクセスのタイミングのみを示していますが、double、float、および string 型の List をテストしたところ、同様の結果が得られました。リクエストがあれば、それらのバージョンを投稿できます。
*すべての場合において、インデックス アクセス方法の方が高速である必要がありますが、マイレージはハードウェアによって大きく異なります。私のコンピューターのElementAt()
および インデックス アクセス方法のアクセス時間は、それぞれ 5.71ns と .27ns です。