ConcurrentBag<int> cb = new ConcurrentBag<int>();
cb.Add(1);
cb.Add(2);
cb.Add(3);
int loop = 0;
foreach(int n in cb)
{
loop++;
Console.WriteLine("Loop: {0} | Number: {0}", loop, n);
}
在这种情况下,使用序列没有意义,for因为除其他外,可以在遍历列表时从另一个执行线程添加/删除元素
最后,您永远不应该做的是使用Array.IndexOf获取索引,因为您将强制在每次迭代的列表中查找
string[] array = {"Item 1", "Item 2", "Item 3"};
foreach (var item in array)
{
// Aquí se hará una búsqueda en la lista perdiendo rendimiento
var index = Array.IndexOf(array, item);
Console.WriteLine($"{index} - {item}");
}
public static void Main()
{
List<int> Lista = new List<int>();
Stopwatch S = new Stopwatch();
Console.WriteLine("Iniciando cronometro para llenar la lista con 10,000 valores");
S.Start();
for (int i = 0; i < 10000; i++) Lista.Add(i);
S.Stop();
Console.WriteLine("Tiempo pasado llenar la lista: " + S.Elapsed.ToString());
Console.WriteLine("\n\nIniciando cronometro para acceder a cada elemento usando el ciclo for:");
S.Restart();
for (int i = 0; i < Lista.Count; i++)
Console.Write(Lista[i]);
S.Stop();
Console.WriteLine("\nTiempo transcurrido usando for: " + S.Elapsed.ToString());
Console.WriteLine("\nIniciando cronometro para acceder a cada elemento usando foreach: ");
S.Restart();
foreach (int e in Lista)
Console.Write(e);
S.Stop();
Console.WriteLine("\nTiempo transcurrido usando foreach: " + S.Elapsed.ToString());
}
int IndexOf<T>(this T[] item, T toSearch)
{
for (int i = 0; i < item.Length; i++)
if (item[i] == toSearch) return i;
return -1; // No recuerdo si arroja al no encontrarlo, por lo que devolvemos null.
}
如果您正在循环遍历元素以创建它们的新列表,则可以使用具有索引重载的扩展方法
Select
(文档)。我认为在 a 中获取索引的正确方法
foreach
是您正在使用的方法,因为它是一个简单且最佳的代码,并且有时使用它会很有趣。ConcurrentBag类就是一个例子
在这种情况下,使用序列没有意义,
for
因为除其他外,可以在遍历列表时从另一个执行线程添加/删除元素最后,您永远不应该做的是使用
Array.IndexOf
获取索引,因为您将强制在每次迭代的列表中查找作为其他人所写的补充,我想写一点理论。
for
:它是一个循环,在整个元素集内迭代,可以是列表,也可以是Array
(通用示例):在它的每次迭代中,它都会找到 中元素的值
i
,Array
导致以下结果:如您所见,是的,
Array
.有了
foreach
这个,它可以翻译成:这将产生相同的输出,现在我们正在谈论
Array
,数组只是一组有限元素,如果我们以 a 为目标List<T>
,事情就会改变:在一个主要依赖是迭代器的类中,为什么不使用
foreach
访问每个元素List<T>
?如果我们提到性能,我们什么都没有,在.NET Framework和循环中,该类List
已经准备好“着火”foreach
,如果没有,则测试每个类的速度。(另一个通用示例):(多次运行前面的例子,检查得到的结果)
现在,如果您想要获取包含迭代器或支持的类中元素的索引,
index
最好使用它的索引器或调用其各自的函数IndexOf
(Asier Villanueva和rsciriano 提到)IndexOf
:它是一个返回一个整数的函数,其中包含一个元素在列表中的当前位置,值得一提的是,这个函数仅适用于命名空间中的集合System.Collections.Generic
,它或多或少看起来像这样:这实际上与自己迭代列表或集合以获取当前元素的索引相同,此函数的实际用途是在您需要获取特定元素时出现,通用示例:
我需要专门检索我的名字(如果存在):
的值为
IndexDeOp
,3
因此如果您不需要遍历列表,这是您的最佳选择。最后提到,循环
foreach
只能在实现 的类或“集合”中使用IEnumerable[<T>]
,但这并不是完全必要的,实现以下功能和属性就足够了GetEnumerator
:Current
和MoveNext
。以下是一些参考链接:
for
,foreach
,小提琴。可以通过 Array 类的 IndexOf 方法获取索引:
但最合乎逻辑的事情是,如果您需要索引,则使用 for。
我会使用另一种类型的循环,因为对于 Foreach,您需要添加一个计数器。您仍然可以使用 Foreach 和单独的计数器。
我会使用一个while循环
正确的做法是使用这样的 for:
Blucle
foreach
用于不需要获取或使用索引而是使用对象的迭代中,使用循环使用索引for