Каков наилучший способ перебора строго типизированного универсального List<T>?

С любой универсальной реализацией collections IEnumerable лучший способ:

//C#
foreach( var item in listVariable) {
    //do stuff
}

Однако generics есть важное исключение. IEnumerable c# включает накладные расходы java-generics на Current() и MoveNext(), то c#.net есть то, во что фактически c#.net скомпилирован цикл foreach.

Если .net-framework у вас есть простой массив java-generics структур:

//C#
int[] valueTypeArray;
for(int i=0; i < valueTypeArray.Length; ++i) {
     int item = valueTypeArray[i];
     //do stuff
}

Быстрее.


Обновление

После обсуждения vb.net с @Steven Sudit (см. комментарии) я vb думаю, что мой первоначальный c-sharp совет может быть устаревшим vb.net или ошибочным, поэтому я c-sharp провел несколько тестов:

// create a list to test with
var theList = Enumerable.Range(0, 100000000).ToList();

// time foreach
var sw = Stopwatch.StartNew();
foreach (var item in theList)
{
    int inLoop = item;
}
Console.WriteLine("list  foreach: " + sw.Elapsed.ToString());

sw.Reset();
sw.Start();

// time for
int cnt = theList.Count;
for (int i = 0; i < cnt; i++)
{
    int inLoop = theList[i];
}
Console.WriteLine("list  for    : " + sw.Elapsed.ToString());

// now run the same tests, but with an array
var theArray = theList.ToArray();

sw.Reset();
sw.Start();

foreach (var item in theArray)
{
    int inLoop = item;
}
Console.WriteLine("array foreach: " + sw.Elapsed.ToString());

sw.Reset();
sw.Start();

// time for
cnt = theArray.Length;
for (int i = 0; i < cnt; i++)
{
    int inLoop = theArray[i];
}
Console.WriteLine("array for    : " + sw.Elapsed.ToString());

Console.ReadKey();

Итак, я .net запустил это в релизе со c-sharp всеми оптимизациями:

list  foreach: 00:00:00.5137506
list  for    : 00:00:00.2417709
array foreach: 00:00:00.1085653
array for    : 00:00:00.0954890

А потом generic отлаживать без оптимизаций:

list  foreach: 00:00:01.1289015
list  for    : 00:00:00.9945345
array foreach: 00:00:00.6405422
array for    : 00:00:00.4913245

Таким generic образом, это кажется довольно java-generics последовательным, for быстрее, чем csharp foreach, а массивы быстрее, чем vb общие списки.

Однако это происходит generic через 100 000 000 итераций, и java-generics разница составляет около c-sharp 0,4 секунды между самым быстрым c-sharp и самым медленным методами. Если vb вы не выполняете массивные .net критические циклы производительности, об java-collections-api этом просто не стоит беспокоиться.

c#

.net

vb.net

generics

collections

2022-02-22T00:32:47+00:00
Вопросы с похожей тематикой, как у вопроса:

Каков наилучший способ перебора строго типизированного универсального List<T>?