在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范围之外,并且我不能声明其他变量具有相同的名称,因为它之前在同一个作用域中声明。

有什么想法?

+1

您将使用name遍历列表,为什么您需要稍后在代码中引用它。我认为你可以编写代码来避免这种用法。 –

+0

@Shamim Hafiz:我有一种情况,我更喜欢一个与foreach循环中名称相同的变量。 – Naor

+0

我有同样的问题。我在try-catch内部使用foreach循环,并在try和catch块内写入日志。我在两个日志中的foreach循环中使用item变量。我最终使用了Jon Skeet前两种方法的变体。 – seebiscuit

嗯,你可以这样做:

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往往会使它基本上是试图找到一些代码很多更容易阅读。

+0

搜索不是这里的问题,但您提供了很好的解决方法。 – Naor

你不能在foreach循环中做到这一点。您正在创建和使用范围限于foreach查询的范围变量。

如果您需要从名字集合中使用一个单独的名称,那么你可以将它分配一个值foreach循环之外:

foreach(string name in names) 
{ 
    if(name == someCondition) 
     someVariable = name; 
} 
+0

OP提到这个名字的范围超出了foreach的范围,这是真的吗? –

+1

@Shamim。在我的例子中,变量名不在这个foreach循环之外。 –

+0

好吧,我想OP是错误的,不能再次使用“名称”。 –

也许吧?

string name; 
foreach (var tmp in names) { name = tmp; } 
+0

你试过了吗?这不起作用。如果是这样,我不会发表这个问题。 – Naor

+0

我相信你错过了我的代码片段。其实,如果你检查一下,所有的答案都至少给出了这个解决方案。现在,我错过了空分配,如果你想挑选。 – Vladimir

+0

您必须将其更改为foreach(名称中的字符串tmp),否则它将无法工作。 +1的想法。 – Naor