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

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

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

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

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

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

Быстрее.


Обновление

После обсуждения java-collections-api с @Steven Sudit (см. комментарии) я collection думаю, что мой первоначальный generic совет может быть устаревшим vbproj или ошибочным, поэтому я generics провел несколько тестов:

// 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();

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

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

А потом c#.net отлаживать без оптимизаций:

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

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

Однако это происходит vbproj через 100 000 000 итераций, и vb.net разница составляет около .net-framework 0,4 секунды между самым быстрым vb.net и самым медленным методами. Если collection вы не выполняете массивные vb.net критические циклы производительности, об dotnet этом просто не стоит беспокоиться.

c#

.net

vb.net

generics

collections

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

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