Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6085
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Что это лучший способ, чтобы выполнить итерации через строго типизированный общего списка?
Как лучше всего перебирать строго типизированный универсальный список в C#.NET и VB.NET?
С любой универсальной реализацией IEnumerable лучший способ-это:
//C#
foreach( var item in listVariable) {
//do stuff
}
Однако есть важное исключение. IEnumerable включает в себя накладные расходы в размере Current() и MoveNext(), в которые фактически компилируется цикл foreach.
Когда у вас есть простой массив структур:
//C#
int[] valueTypeArray;
for(int i=0; i < valueTypeArray.Length; ++i) {
int item = valueTypeArray[i];
//do stuff
}
Это быстрее.
Обновление
После обсуждения с @Steven Sudit (см. комментарии) я думаю, что мой первоначальный совет может быть устаревшим или ошибочным, поэтому я провел несколько тестов:
// 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();
Итак, я запустил это в релизе со всеми оптимизациями:
list foreach: 00:00:00.5137506
list for : 00:00:00.2417709
array foreach: 00:00:00.1085653
array for : 00:00:00.0954890
А потом отлаживать без оптимизаций:
list foreach: 00:00:01.1289015
list for : 00:00:00.9945345
array foreach: 00:00:00.6405422
array for : 00:00:00.4913245
Таким образом, он выглядит довольно последовательным, for быстрее, чем foreach , и массивы быстрее, чем универсальные списки.
Однако это происходит через 100 000 000 итераций, и разница составляет около .4 секунды между самыми быстрыми и самыми медленными методами. Если вы не делаете массивные циклы критической производительности, то просто не стоит беспокоиться об этом.
C#
myList<string>().ForEach(
delegate(string name)
{
Console.WriteLine(name);
});
Анонимные делегаты в настоящее время не реализованы в VB.Net, но и C#, и VB.Net должны иметь возможность выполнять лямбды:
C#
myList<string>().ForEach(name => Console.WriteLine(name));
VB.Net
myList(Of String)().ForEach(Function(name) Console.WriteLine(name))
Как отметил Грауэн Волк, вышеупомянутый VB не будет компилироваться, так как lambda не возвращает значения. Обычный цикл ForEach, как предполагали другие, вероятно, самый простой на данный момент, но, как обычно, требуется блок кода, чтобы сделать то, что может сделать C# в одной строке.
Вот банальный пример того, почему это может быть полезно: это дает вам возможность передавать логику цикла из другой области, чем та, где существует IEnumerable, так что вам даже не нужно выставлять его, если вы этого не хотите.
Допустим, у вас есть список относительных путей url, которые вы хотите сделать абсолютными:
public IEnumerable<String> Paths(Func<String> formatter) {
List<String> paths = new List<String>()
{
"/about", "/contact", "/services"
};
return paths.ForEach(formatter);
}
Таким образом, вы можете вызвать функцию таким образом:
var hostname = "myhost.com";
var formatter = f => String.Format("http://{0}{1}", hostname, f);
IEnumerable<String> absolutePaths = Paths(formatter);
Даю вам "http://myhost.com/about", "http://myhost.com/contact" и т.д. Очевидно, что есть лучшие способы достичь этого в этом конкретном примере, я просто пытаюсь продемонстрировать основной принцип.
Не зная внутренней реализации списка, я думаю, что в целом лучшим способом итерации по нему будет цикл foreach. Поскольку foreach использует IEnumerator для обхода списка, то сам список определяет, как переходить от объекта к объекту.
Если бы внутренняя реализация была, скажем, связанным списком, то простой цикл for был бы намного медленнее, чем foreach.
Есть ли в этом смысл?
Возможно, я что-то упускаю, но повторение общего списка должно быть довольно простым, если вы используете мои примеры ниже. Класс List<> реализует интерфейсы IList и IEnumerable, так что вы можете легко перебирать их практически любым способом.
Наиболее эффективным способом было бы использовать цикл for:
for(int i = 0; i < genericList.Count; ++i)
{
// Loop body
}
Вы также можете использовать цикл foreach:
foreach(<insertTypeHere> o in genericList)
{
// Loop body
}