Каков наилучший способ перебора строго типизированного универсального 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
Каков наилучший способ перебора строго типизированного универсального List<T>?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.