29. januar 2008 - 16:02Der er
25 kommentarer og 1 løsning
Sortering af arralist
hej Jeg skal sortere en tabel der inde holder Cprnr ,serienr, score resultat er så 2501801111,1,24 2501801111,2,32 2501801111,3,28 osv. men jeg ville gerne have den til at gøre sådan her .
2501801111,24,28,32 så man kun får listet cprnr også scorene for en given konkurrence. hvordan gør man det nemmest.
NB min AccessDataReader returnere som skrvet ovenfor 2501801111,1,24 2501801111,2,32 2501801111,3,28
ArrayList List = DataAccessWrite.reader("Select cprnr,serienr,score From Serie_tbl WHERE KonID = " + DataAccessWrite.PubString2); for (int i = 0; i < List.Count; i++) { List.Sort(new MyComparer()); this.listBox1.Items.Add(List[i]); }
string currentValue =""; string lastCpr = null; for(int i = 0; i< List.Count; i++) { string[] t = List[i].Split(','); //Split
if(lastCpr != null) //Hvis sidste CPR ikke er sat: lastCpr = currentValue = t[0]; //Sæt aktivt CPR. currentValue += "," + t[2]; //Tilføj score else if (lastCpr = t[0]) //Hvis sidste CPR er sat men = det aktive. currentValue += "," + t[2]; //Tilføj score else //Hvis CPR er sat men forskelligt fra det aktive. { this.listBox1.Items.Add(currentValue); //Skriv den genererede streng til liste. lastCpr = t[0]; //Sæt nyt aktivt CPR currentValue += "," + t[2]; //Tilføj score } }
hmm den nye kode du skrev powerpunk.. kan jeg ikke få til at skrive noget
ArrayList List = DataAccessWrite.reader("Select cprnr,serienr,score From Serie_tbl WHERE KonID = " + DataAccessWrite.PubString2);
List.Sort(new MyComparer());
string currentValue = ""; string lastCpr = null; for (int i = 0; i < List.Count; i++) { string[] t = List[i].ToString().Split(','); //Split
if (lastCpr != null) //Hvis sidste CPR ikke er sat: { lastCpr = currentValue = t[0]; //Sæt aktivt CPR. currentValue += "," + t[2]; //Tilføj score } else if (lastCpr == t[0]) //Hvis sidste CPR er sat men = det aktive. { currentValue += "," + t[2]; //Tilføj score } else //Hvis CPR er sat men forskelligt fra det aktive. { this.listBox1.Items.Add(currentValue); //Skriv den genererede streng til liste. lastCpr = t[0]; //Sæt nyt aktivt CPR currentValue += "," + t[2]; //Tilføj score }
Arne_v's kode er lidt pænere end min hvad angår logikken i for-loopet: dog synes jeg et par ændringer ville være på sin plads:
for (int i = 0; i < lst.Count; i++) { string[] parts = ((string)lst[i]).Split(','); //Ingen grund til at konverter string til char array, når der kun skal bruges en char... //heller ingen grund til først at caste til int for så at lave en streng igen... if(parts[0] != old) { if(temp != "") this.listBox1.Items.Add(temp); temp = parts[0] + "," + parts[2]; old = parts[0]; } else { temp = temp + "," + parts[2]; } }
Der er vi jo så tilbage i at en liste ikke er så godt gearet til datamanipulation.
Sortering af data er afgjort nemmest enten i dataudtrækket eller ved brug af en eller anden data-klasse f.eks DataSet/DataTable/DataView, alternativt nogle hjemmebryggede objects og en comparer.
Eksempelvis kunne du lave et object der indeholdt cprnummer og en liste af scores. Objektet bruger IComparable for at kunne sammenligne sig med andre Players f.eks:
public class Player : IComparable<Player> { private string _cpr; private readonly List<int> _scores = new List<int>();
public ReadOnlyCollection<int> Scores { get { return _scores.AsReadOnly(); } }
public int MaxScore { get { return _scores[_scores.Count - 1]; } }
public string Cpr { get { return _cpr; } }
public Player(string cpr) { _cpr = cpr; }
public void AddScore(int score) { _scores.Add(score); _scores.Sort(); _scores.Reverse(); }
public override string ToString() { string temp = _cpr; foreach (int i in _scores) temp += "," + i; return temp; }
#region IComparable<Player> Members
public int CompareTo(Player other) { return MaxScore.CompareTo(other.MaxScore); }
string old = ""; List<Player> players = new List<Player>(); Player temp = null;
foreach (string s in lst) { string[] parts = s.Split(','); string cpr = parts[0]; int score = int.Parse(parts[2]);
if (cpr != old) { temp = new Player(cpr); players.Add(temp); temp.AddScore(score); old = cpr; } else { temp.AddScore(score); } } players.Sort(); //Sorter players.Reverse(); //Reverse, da vi vil have spiller med højeste score først...
foreach (Player p in players) Console.WriteLine(p);
Du kan jo bare undlade: players.Sort(); players.Reverse();
Men du er nødt til som minimum at have grupperet dit dataudtræk så ens cpr-numre kommer i rigtig rækkefølge.
hvis du undlader de to ovenstående linjer er resultatet
output er:
240101000,27,24,24 888888888,78,77,41
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.