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