2011-08-16 14 views
10

W przypadku pętli for można zadeklarować indeks poza instrukcją for. Na przykład, zamiastzadeklaruj zmienną poza pętlą foreach

for (int i = 0; i < 8; i++) { } 

mogę zrobić:

int i; 
for (i = 0; i < 8; i++) { } 

Teraz w porównaniu do foreach pętli, muszę zadeklarować zmienną wewnątrz pętli:

foreach (string name in names) { } 

i nie mogę zrób coś takiego:

string name; 
foreach (name in names) { } 

Powodem, dla którego to mnie martwi, jest to, że po pętli chcę ponownie użyć zmiennej "name". W przypadku pętli foreach nie można użyć zmiennej "name", ponieważ jest ona poza zakresem foreach i nie mogę zadeklarować innej zmiennej o tej samej nazwie, ponieważ zadeklarowała ona wcześniej w tym samym zakresie.

Każdy pomysł?

+1

Używałbyś nazwy do iteracji na liście, dlaczego powinieneś odwołać się do niej później w swoim kodzie. Myślę, że możesz kodować, aby uniknąć potrzeby takiego użycia. –

+0

@Shamim Hafiz: Mam przypadek, w którym wolę zmienną o tej samej nazwie, co w pętli foreach. – Naor

+0

Miałem ten sam problem. Używam pętli foreach wewnątrz try-catch i piszę do logu wewnątrz bloku try i catch. Używam zmiennej item w pętli foreach wewnątrz obu dzienników. Skończyło się na tym, że użyłem jednej z dwóch pierwszych metod Jona Skeeta. – seebiscuit

Odpowiedz

11

dobrze, można zrobić:

string name = null; // You need to set a value in case the collection is empty 
foreach (string loopName in names) 
{ 
    name = loopName; 
    // other stuff 
} 

Albo raczej:

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; 
    } 
} 

Jeśli zawartość pętli foreach jest jus t znaleźć element pasujący - które przynajmniej brzmi prawdopodobne - to należy rozważyć, czy LINQ byłby lepszy mecz:

string name = names.Where(x => x.StartsWith("Fred")) 
        .FirstOrDefault(); 

Używanie LINQ często może uczynić kod, który jest w zasadzie próbuje znaleźć coś lot łatwiejszy do odczytania.

+0

Wyszukiwanie nie jest tutaj problemem, ale zapewniasz dobre obejście tego problemu. – Naor

1

Nie można tego zrobić w pętlach foreach. Tworzysz i używasz zmiennej zasięgu, której zakres jest ograniczony do zapytania foreach.

Jeśli trzeba użyć indywidualną nazwę od wewnątrz kolekcji nazwy następnie można przypisać jej wartość na zewnątrz pętli foreach:

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

OP o tym, że nazwa pozostaje poza zasięgiem foreach, czy to prawda? –

+1

@Shamim. W moim przykładzie nazwa zmiennej nie będzie znajdować się poza tą pętlą foreach. –

+0

Ach, OK, myślę, że OP nie ma racji, że nie może ponownie użyć "nazwy". –

1

Może?

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

Czy próbowałeś? to nie działa. Gdyby tak było, nie wysłałbym tego pytania. – Naor

+0

Jestem pewien, że przegapiłeś coś z mojego fragmentu. Właściwie, jeśli to sprawdzisz, wszystkie odpowiedzi podadzą przynajmniej to rozwiązanie. Teraz brakowało mi zadania zerowego, jeśli chcesz rzucić palcem. – Vladimir

+0

musisz zmienić go na foreach (string tmp w nazwach) inaczej nie będzie działać. +1 za pomysł. – Naor

Powiązane problemy