2011-08-16 225 views
10

在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

回答

11

嗯,你可以這樣做:

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

1

你不能在foreach循環中做到這一點。您正在創建和使用範圍限於foreach查詢的範圍變量。

如果您需要從名字集合中使用一個單獨的名稱,那麼你可以將它分配一個值foreach循環之外:

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

OP提到這個名字的範圍超出了foreach的範圍,這是真的嗎? –

+1

@Shamim。在我的例子中,變量名不在這個foreach循環之外。 –

+0

好吧,我想OP是錯誤的,不能再次使用「名稱」。 –

1

也許吧?

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

你試過了嗎?這不起作用。如果是這樣,我不會發表這個問題。 – Naor

+0

我相信你錯過了我的代碼片段。其實,如果你檢查一下,所有的答案都至少給出了這個解決方案。現在,我錯過了空分配,如果你想挑選。 – Vladimir

+0

您必須將其更改爲foreach(名稱中的字符串tmp),否則它將無法工作。 +1的想法。 – Naor

相關問題