return pod foreach

0

Cześć,
mam taki problem że return pod foreachem nie działa.
Próbowałem to jakoś zrobić z if ale też nic nie dało.
Podaje kod:

 
public string zmienZeWzoru()
        {
           
            r = new Regex(@"(?<mail>\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)");
            MatchCollection mcol = r.Matches(gdzieZmienic);
         
            if (mcol.Count<1)
                return null;
            else
            {
                foreach (Match m in mcol)
                    return Regex.Replace(gdzieZmienic, m.Value, naCoZmienic);
            }

         }

Błąd mówi że nie wszystkie możliwe zakończenia zwracają wartość.

0

Kompilator C# nie analizuje statycznie twojego programu na tyle, by skojarzyć warunek z pętlą. Dla niego wynik porównania nie ma związku z tym, że foreach może nie wykonać się w ogóle.

Wywal całą pętlę, zostaw sam foreach i na sam koniec daj return null.

3
                foreach (Match m in mcol)
                    return Regex.Replace(gdzieZmienic, m.Value, naCoZmienic);

Jaki to ma sens?

return wykonany dla pierwszego m wyjdzie z funkcji, reszta pętli się nie wykona. Kod jest równoważny temu:

return Regex.Replace(gdzieZmienic, mcol[0].Value, naCoZmienic);
0

Hmm, faktycznie return w foreachu jest błędny.
W takim razie jak to skomponować ażeby na wyjściu był string, i żeby zamieniało wszystkie trafienia na zmienną "naCoZmienic"?

Edit@

Rozwiązane:

 public string zmienZeWzoru()
        {
            nowy = gdzieZmienic;
           
           r = new Regex(@"\b\S+@\S+");
             MatchCollection mcol = r.Matches(gdzieZmienic);
       
             foreach (Match m in mcol)
             {
                 nowy = Regex.Replace(nowy, m.Value, naCoZmienic);
                
             }
                 return nowy;

         }

Niemniej dziękuję za naprowadzenie mnie.
Pozdrawiam

3

@Vifi, w takim przypadku, gdy masz wykonać wiele operacji na jednym stringu, lepiej gdybyś użył klasy StringBuilder, ona też ma metodę Replace: http://msdn.microsoft.com/en-us/library/3h5afh4w.aspx
O tym, dlaczego StringBuilder jest lepszy, możesz poczytać np. tutaj: http://www.dotnetperls.com/stringbuilder-performance

1 użytkowników online, w tym zalogowanych: 0, gości: 1