Okay, så tror jeg at jeg har fanget den!
Du har tilsyneladende anvendt aejw's INI Class til .NET fra codeproject:
http://www.codeproject.com/KB/files/aejw_ini_class.aspxJeg kender ikke lige til den specifikke implementation aejw har brugt og ved meget lidt om de ini-filer der outputtes til counter-strike (der er da counter-strike, er det ikke?), men jeg har forsøgt lige at sætte mig ind i, hvordan aejw's kode kan benyttes.
Her er et forslag til hvordan det kan gennemføres, jeg har forsøgt at holde det simpelt, så der er sikkert mulighed for optimering, hvis man finder det nødvendigt.
aejw.cIni ini = new aejw.cIni(@"c:/temp/gather/maps.ini");
//maps kommer til at indeholde navne på de maps der har stats
Array maps = new Array[0];
//her indlæses alle maps, grunden til de læses fra stats og ikke maps, er
//at navnene også findes under stats og på denne måde sikres der at der kun
//medtages de maps der findes stats til.
ini.ReadValues("stats", ref maps);
//dette array skal indeholde værdier tilsvarende den enkelte map-værdi.
int[] mapvalues = new int[maps.Length];
//denne værdi angiver hvor mange spil der er spillet i alt.
//den er nødvendig for at kunne udregne procent.
int totalPlays = 0;
//her gennemgåes hvert mapnavn og der hentes en værdi for hvert map
for (int i = 0; i < maps.Length; i++)
{
mapvalues[i] = Convert.ToInt32(ini.ReadValue("stats", (string)maps.GetValue(i)));
//totalPlays inkrementeres tilsvarende den værdi som indlæses
totalPlays += mapvalues[i];
}
//Her er anvendt en stringbuilder for at sammensætte resultat-stringen
//man kunne også bare bruge en string og lægge til denne løbende.
//Der anvendes en format-string for at opstille data på den ønskede måde.
//Bemærk: procent udregnes med heltals-division, dvs. ingen decimaltal -
//en trediedel (1/3) vil blive repræsenteret som 33% - der rundes altid ned
StringBuilder builder = new StringBuilder();
for (int i = 0; i < maps.Length; i++)
builder.Append(String.Format("{0}. {1} ({2},{3}%) ", i+1, maps.GetValue(i), mapvalues[i], (mapvalues[i] * 100) / totalPlays));
//output svarer til den ønskede resultatstring
string output = builder.ToString();
Jeg har gået ud fra at det er aejw's implementation du har anvendt, hvis det ikke er tilfældet vil ovenstående kode ikke fungere. Hvis det er, burde 'output' blive sat lig "1. de_dust2 (2,100%) 2. de_inferno (0,0%)" givet at den beskrevne ini-fil anvendes som input.
Jeg har været lidt i tvivl om hvad du mente med "Desuden skal den kun skrive to decimaltal efter kommaet.", men jeg går ud fra at du mener at 66.66666% skal repræsenteres som 66%. Hvis det ikke er tilfældet må vi lige vende tilbage til den.
Løsningen er ikke helt fejlsikret, hvis der under [stats] tagget i ini-filen kan forekomme ugyldige data, såsom "de_dust2=kk" eller "de_dust=" (hvor værdien ikke er sat), vil programmet sandsynligvis crashe. Det kan vi dog se lidt nærmere på, hvis det bliver relevant.
Jeg håber at det gav nogenlunde mening :)