Bygge en string i C#

Tags:    c# string-builder

Jeg har et Windows-program i C# som indlæser nogle filer der senere skal renames. Hvad de skal renames til, bestemmer brugeren selv i en konfigurationsfil vha. variabler.

Variablerne er:

$P(længde) - deltagernr og max. længden i parantes
$S(længde) - sekvensnr og længden i parantes
$YY - årstal med to cifre
$YYYY - årstal med fire cifre
$MM - måned med to cifre

Brugeren skriver så f.eks. $P(5)_$YY_$S(3) hvor der så i programmet f.eks. læses 12 filer ind for deltagernr. 5 i 2012, hvilket giver følgende filnavne:

00005_12_001
00005_12_002
.
.
.
00005_12_012


Findes der en nem måde at bygge sådan en streng op med ovenstående krav? Jeg har selvfølgelig alle værdier for $ variablerne til rådighed, i det loop som skal rename de enkelte filer.

Jeg forestiller mig at stringbuilder er vejen frem, så gode ideer er velkommen :-)



Indlæg senest redigeret d. 29.07.2012 16:11 af Bruger #9814
2 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 9 karma
Sorter efter stemmer Sorter efter dato
Har du lavet en parser til din rename-streng?

Her er min umiddelbare ide:

Siden jeg ikke ved du har informationerne som år, måned, sekvensnr og deltagernr, antager jeg at de findes i en klasse FileInfo.

Du har et interface som givet en FileInfo returnerer en streng der repræsenterer filnavnet:
Fold kodeboks ind/udCSharp kode 


Du parser rename-strengen og med den laver en instans af en klasse der implementerer Renamer. Parsingen kan eventuelt foregå i denne klasse hvis ikke udenfor.

Så i din loop vil du lave noget lign:
Fold kodeboks ind/udCSharp kode 


Spørgsmålet er så hvordan din renamer fungerer internt. En ide er at lave et andet interface som igen givet en FileInfo returnerer en streng. Men denne gang er strengen en del af et filnavn. I implementeringen af din Renamer kunne ligne det her:
Fold kodeboks ind/udCSharp kode 


Dine IRenamePart kommer fra parsingen. F.eks. når du læser $P(5) laver du måske en instans af ParticipantPart, som implementerer IRenamePart, hvor du kalder constructoren med 5. Når så kalder dens GetFilePart(info) så returner den deltagernr som 5 tegn langt. For alt det "udenfor" $'erne kan du f.eks. lave en StringPart som blot returnerer strengen og ignorer den FileInfo du fik sendt.

Er godt klar over at det er nogle dårlige navne jeg er kommet på men jeg kender ikke domænet. Mit gæt er det har noget med sport at gøre.



Indlæg senest redigeret d. 29.07.2012 19:27 af Bruger #14645
Tak for input Søren.

Programmet er til indlæsning af billeder i forbindelse med en fotokonkurrence, hvor hver deltager kan have 12 eller 24 billeder på et memorykort. Billederne skal så navngive efter at de er loaded fra memorykort og det skal kunne konfigureres.

Min rename metode modtager de nødvendige parametre (deltagernr. og sekvensnr.), mens år og måned bare hentes med hhv. DateTime.Now.Year og String.Format("{0:00}", DateTime.Now.Month)

Selve strengen fra konfigurationsfilen som indeholder hvordan der skal renames, har jeg liggende i en shared klasse med en static egenskab. Den returnerer f.eks. $P(5)_$YY_$S(3)

Jeg kan godt se pointen i dit input, men var selv ude i noget simpel streng-behandling. Men jeg arbejder lige videre med dine ideer.

Tak ;-)



t