在foreach循环之外声明变量
在for循环中,我可以在for语句之外声明索引。例如,而不是在foreach循环之外声明变量
for (int i = 0; i < 8; i++) { }
我可以这样做:
int i;
for (i = 0; i < 8; i++) { }
现在比较foreach循环,我必须声明循环内的变量:
foreach (string name in names) { }
,我不能做类似:
string name;
foreach (name in names) { }
这个困扰我的原因是循环后我想再次使用变量“name”。在foreach循环的情况下,变量“name”不能被使用,因为它在foreach范围之外,并且我不能声明其他变量具有相同的名称,因为它之前在同一个作用域中声明。
有什么想法?
嗯,你可以这样做:
string name = null; // You need to set a value in case the collection is empty
foreach (string loopName in names)
{
name = loopName;
// other stuff
}
或者更可能:
string name = null; // You need to set a value in case the collection is empty
foreach (string loopName in names)
{
if (someCondition.IsTrueFor(loopName)
{
name = loopName;
break;
}
}
如果foreach循环的内容是强制牛逼找到匹配的元素 - 其中至少听起来可能 - 那么你应该考虑LINQ是否会是一个更好的匹配:
string name = names.Where(x => x.StartsWith("Fred"))
.FirstOrDefault();
使用LINQ往往会使它基本上是试图找到一些代码很多更容易阅读。
搜索不是这里的问题,但您提供了很好的解决方法。 – Naor
你不能在foreach循环中做到这一点。您正在创建和使用范围限于foreach查询的范围变量。
如果您需要从名字集合中使用一个单独的名称,那么你可以将它分配一个值foreach循环之外:
foreach(string name in names)
{
if(name == someCondition)
someVariable = name;
}
OP提到这个名字的范围超出了foreach的范围,这是真的吗? –
@Shamim。在我的例子中,变量名不在这个foreach循环之外。 –
好吧,我想OP是错误的,不能再次使用“名称”。 –
您将使用name遍历列表,为什么您需要稍后在代码中引用它。我认为你可以编写代码来避免这种用法。 –
@Shamim Hafiz:我有一种情况,我更喜欢一个与foreach循环中名称相同的变量。 – Naor
我有同样的问题。我在try-catch内部使用foreach循环,并在try和catch块内写入日志。我在两个日志中的foreach循环中使用item变量。我最终使用了Jon Skeet前两种方法的变体。 – seebiscuit