如果您将 C# 作为一种语言,您可能还应该考虑使用 LINQ,因为这是执行循环的另一种合乎逻辑的方式。
对列表中的每个项目执行操作您是指在列表中就地修改它,还是简单地对项目做一些事情(例如打印它、累积它、修改它等.)?我怀疑是后者,因为 C# 中的 foreach 不允许您修改正在循环的集合,或者至少不是以方便的方式...
这里有两个简单的构造,首先使用for,然后使用foreach,它们访问列表中的所有字符串并将它们转换为大写字符串:
List<string> list = ...;
List<string> uppercase = new List<string> ();
for (int i = 0; i < list.Count; i++)
{
string name = list[i];
uppercase.Add (name.ToUpper ());
}
(请注意,使用结束条件 i < list.Count 而不是 i < length 和一些预计算机 length 常量在 .NET 中被认为是一种好的做法,因为编译器无论如何都必须在 list[i] 时检查上限在循环中调用;如果我的理解是正确的,编译器可以在某些情况下优化掉它通常会完成的上限检查)。
这是foreach 等效项:
List<string> list = ...;
List<string> uppercase = new List<string> ();
foreach (name in list)
{
uppercase.Add (name.ToUpper ());
}
注意:基本上,foreach 构造可以迭代 C# 中的任何 IEnumerable 或 IEnumerable<T>,而不仅仅是数组或列表。因此,集合中元素的数量可能事先不知道,甚至可能是无限的(在这种情况下,您当然必须在循环中包含一些终止条件,否则它不会退出)。
这里有一些我能想到的等效解决方案,使用 C# LINQ 表达(并且引入了 lambda 表达式 的概念,基本上是一个内联函数,采用 x 并返回 x.ToUpper ()在以下示例中):
List<string> list = ...;
List<string> uppercase = new List<string> ();
uppercase.AddRange (list.Select (x => x.ToUpper ()));
或者使用由其构造函数填充的uppercase 列表:
List<string> list = ...;
List<string> uppercase = new List<string> (list.Select (x => x.ToUpper ()));
或者同样使用ToList函数:
List<string> list = ...;
List<string> uppercase = list.Select (x => x.ToUpper ()).ToList ();
或者还是和类型推断一样:
List<string> list = ...;
var uppercase = list.Select (x => x.ToUpper ()).ToList ();
或者,如果您不介意将结果作为 IEnumerable<string>(可枚举的字符串集合),您可以删除 ToList:
List<string> list = ...;
var uppercase = list.Select (x => x.ToUpper ());
或者可能是另一个具有类似 C# SQL 的 from 和 select 关键字,它们完全等效:
List<string> list = ...;
var uppercase = from name in list
select name => name.ToUpper ();
LINQ 的表现力很强,很多时候,我觉得代码比普通的循环更具可读性。
您的第二个问题,在列表中搜索一个项目,并希望在找到该项目时退出也可以使用 LINQ 非常方便地实现。这是foreach 循环的示例:
List<string> list = ...;
string result = null;
foreach (name in list)
{
if (name.Contains ("Pierre"))
{
result = name;
break;
}
}
下面是简单的 LINQ 等价物:
List<string> list = ...;
string result = list.Where (x => x.Contains ("Pierre")).FirstOrDefault ();
或使用查询语法:
List<string> list = ...;
var results = from name in list
where name.Contains ("Pierre")
select name;
string result = results.FirstOrDefault ();
results 枚举仅按需执行,这意味着当在其上调用FirstOrDefault 方法时,列表只会被迭代直到满足条件。 p>
我希望这能为for 或foreach 的辩论带来更多背景,至少在.NET 世界中是这样。