Ez miért így működik C#-ban (IndexOf, LastIndexOf)?
Adott egy szöveg, aminek az első és utolsó specifikus karakterét akarom trimelni úgy, hogy ez a karakter előfordulhat a szöveg közepén is.
Ha ezt IndexOf-al és a LastIndexOf-al, illetve a Remove függvényekkel tenném meg két lépésben:
var a = "\"asd\"\"" // "asd""-ból akarnék asd"-ot.
if (a.IndexOf('\"', 0) == 0) a = a.Remove(a.IndexOf('\"', 0), 1); // Ezzel szépen el is távolítom az első " karaktert.
if (a.LastIndexOf('\"', 0) == 0) a = a.Remove(a.LastIndexOf('\"', 0), 1);
A probléma, amit nem értek (a feladatot nyilván meg bírom oldani és biztosan van rá egyszerűbb megoldás is) az az, hogy az alap esetben "asd""-nál az indexof és a lastindexof is helyesen 0.
Viszont miután remove-oltam az első " karaktert, így a 2. if-nél az asd""-on végzett lastindexof már -1-es index-et ad vissza, mintha az első remove után egy whitespace került volna a string végére. Tehát olyan, mintha a remove után az egész balra csúszott volna 1 karakterrel.
Közben rájöttem a problémára. Valamiért azt gondoltam, hogy a LastIndexOf hátulról iterál előre a stringben és úgy keresi az első egyező karaktert, de ugyan úgy megy végig a stringen, mint a sima IndexOf.
Amit igazából még mindig nem értek, hogy miért így írták meg, mert ha utolsó egyező karaktert keresünk, akkor nem lenne hatékonyabb, ha hátulról iterálnánk a szövegen addig, amíg nem találjuk meg a karaktert?
Ha a LastIndex által keresett index a szöveg 2. felében van, akkor mindenképpen hatékonyabb lenne hátulról indulni, ellenkező esetben meg nyilván nem, szóval talán azért maradhattak ennél a megvalósításnál, hogy egységesebb legyen a működésük?
Ha a karakter összes előfordulását elakarod távolítani, akkor így a legegyszerűbb:
a.Replace("\\", "");
Ha csak a két szélén:
a.Trim('\\');
További kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!