04. januar 2007 - 09:15Der er
32 kommentarer og 1 løsning
Den maksimale værdi i en ArrayList
Hej eksperter..
Sidder og roder i noget C# kode for at repetere de ting jeg har lært i mit første semester på DM..
Jeg er igang med at lave et system der er indeholder nogle brugere. Brugerne gemmer jeg i en binær fil og kalder ind i system i en ArrayList()
Jeg vil under oprettelsen af en bruger gerne have at de får tildelt et automatisk brugernummer, altså så den tjekker hvilket brugernr der er det højeste i systemet i forvejen og ligger en til. Men hvordan får jeg trukket det højeste brugernummer ud af min ArrayList()?
Error 1 foreach statement cannot operate on variables of type 'Sportal.BrugerCollection' because 'Sportal.BrugerCollection' does not contain a public definition for 'GetEnumerator' C:\Documents and Settings\Hans Ole Andersen\Skrivebord\Sportal\Sportal\Startup.cs 76 13 Sportal
Error 2 Operator '>' cannot be applied to operands of type 'method group' and 'int' C:\Documents and Settings\Hans Ole Andersen\Skrivebord\Sportal\Sportal\Startup.cs 78 21 Sportal
Error 3 Cannot convert method group 'GetBrugerNr' to non-delegate type 'int'. Did you intend to invoke the method? C:\Documents and Settings\Hans Ole Andersen\Skrivebord\Sportal\Sportal\Startup.cs 79 31 Sportal
[Serializable] //SØRGER FOR AT BRUGERCOLLECTION KAN SERIALISERES class BrugerCollection { private ArrayList brugere;
[NonSerialized] //SØRGER FOR AT NÆSTE LINIE IKKE MEDTAGES I SERIALISERINGEN private int aktuelBrugerIdx;
public BrugerCollection() { brugere = new ArrayList(); aktuelBrugerIdx = 0; }
//PRE: BRUGERNR FINDES IKKE I NOGEN ANDRE BRUGERE //POST: BRUGEROBJEKT OPRETTET OG RETURNERET public Bruger OpretBruger(int brugernr) { Bruger bruger = new Bruger(brugernr); brugere.Add(bruger); return bruger; }
//PRE: BRUGERNR FINDES I BRUGERE //POST: INDEX I BRUGERE FOR BRUGER MED BRUGERNR RETURNERET private int GetBrugerIdx(int brugernr) { int i; for (i = 0; i < brugere.Count; i++) { if (brugernr == ((Bruger)brugere[i]).GetBrugerNr()) break; } return i; }
//PRE: BRUGERNR FINDES I BRUGERE //POST: BRUGER MED BRUGERNR SLETTET FRA BRUGERE public void SletBruger(int brugernr) { int index; index = GetBrugerIdx(brugernr); brugere.RemoveAt(index); }
//PRE: BRUGERNR FINDES I BRUGERE //POST: BRUGER MED BRUGERNR RETURNERET public Bruger GetBruger(int brugernr) { int index; index = GetBrugerIdx(brugernr); return (Bruger)(brugere[index]); }
//ITERATOR-METODER (GENNEMLØB AF BRUGERE)
//POST: ITERATOR NULSTILLES (DVS. PEGER PÅ FØRSTE BRUGER) // -- RETURNERER FALSE HVIS DER IKKE ER NOGEN BRUGERE, ELLER TRUE public bool Foerste() { aktuelBrugerIdx = 0; return (brugere.Count > 0); }
//POST: AKTUEL VARE (DEN SOM ITERATOREN PEGER PÅ) RETURNERES public Bruger GetBruger() { return (Bruger)(brugere[aktuelBrugerIdx]); }
//POST: PEGER PÅ NÆSTE BRUGER HVIS DER ER FLERE // - OG RETURNERER TRUE, ELLERS FALSE public bool Naeste() { aktuelBrugerIdx++; return (aktuelBrugerIdx < brugere.Count); } }
Har en metode der gennemløber et filestream og føjer dem til en comboboks..
public void OpdaterBrugerListe() { //INDLÆS FORNØDNE KLASSER BrugerCollection brugerCollection; Bruger bruger;
brugerCollection = new BrugerCollection();
//ÅBEN FIL FOR LÆSNING FileStream fileStream = new FileStream(FILNAVN, FileMode.Open, FileAccess.Read);
//TILKNYT BINARY-FORMATER TIL FILESTREAM BinaryFormatter binFormatter = new BinaryFormatter();
//DESERIALISÉR FILESTREAM TIL BRUGERCOLLECTIOn brugerCollection = (BrugerCollection)binFormatter.Deserialize(fileStream);
//LUK FILESTREAM fileStream.Close();
//GENNEMLØB ITERATOR OG INDSÆT BRUGERE I COMBOBOKSEN string navn; int brugernr; if (brugerCollection.Foerste()) { do { bruger = brugerCollection.GetBruger(); navn = bruger.GetNavn(); brugernr = bruger.GetBrugerNr(); cbVælgBruger.Items.Add(navn + " (" + brugernr.ToString() + ")"); } while (brugerCollection.Naeste()); } }
Når man skal oprette en ny bruger (den del hvor jeg skal bruge brugernummet) opretter jeg brugeren i Arrayet og skriver til en fil:
private void btnOpretBruger_Click(object sender, EventArgs e) { //KALD DE FORNØDNE KLASSER BrugerCollection brugerCollection; Bruger bruger; brugerCollection = new BrugerCollection();
//INDLÆS ATTRIBUTTER int brugernr; string navn;
//TJEK HVILKET BRUGERNR DER ER LEDIGT int highest = 0; foreach (Bruger b in brugerCollection) { if (b.GetBrugerNr > highest) highest = b.GetBrugerNr; }
//KALD NAVN IND FRA BRUGEREN navn = txtFornavn.Text + " " + txtEfternavn.Text;
//OPRET BRUGEROBJEKT bruger = brugerCollection.OpretBruger(brugernr); bruger.SetNavn(navn);
MessageBox.Show("Bruger oprettet med ID:" + brugernr);
//SKAB FIL FOR SKRIVNING FileStream filestream = new FileStream(FILNAVN, FileMode.Create, FileAccess.Write);
//TILKNYT BINARY-FORMATER TIL FILESTREAM BinaryFormatter binFormatter = new BinaryFormatter();
//SERIALISÉR BRUGERCOLLECTION TIL FILESTREAM binFormatter.Serialize(filestream, brugerCollection);
//LUK FILESTREAM filestream.Close();
//OPDATÉR BRUGERLISTE OpdaterBrugerListe(); }
Kan dog ikke kalde brugerne ordentligt ud når den ikke vil tildele dem et seperat brugernummer...
Hvis du, i din OpdaterBrugerListe(), også initialiserer en arraylist, og så smider dine brugere derind samtidigt, så vil du have dem på en måde hvor du lyn hurtigt (og dejlig nemt), kan gennemløbe dem med en foreach. Så skal du bare lige lave en metode i din BrugerCollection, hvor du modtager en arraylist, og smider dem ned i den arraylist du allerede har.
//INDLÆS FORNØDNE KLASSER BrugerCollection brugerCollection; Bruger bruger; ArrayList brugere = new ArrayList;
og
{ do { bruger = brugerCollection.GetBruger(); navn = bruger.GetNavn(); brugernr = bruger.GetBrugerNr(); brugere.Add(bruger); cbVælgBruger.Items.Add(navn + " (" + brugernr.ToString() + ")"); } while (brugerCollection.Naeste()); // Her smider du så alle dine brugere over i din BrugerCollection :) }
I BrugerCollection ville jeg nok bare lige lynhurtigt lave noget
public void SaveUsers(ArrayList users) { brugere = users; }
Du har jo i forvejen en ArrayList :) Derudover ville jeg egentlig nok også lige lave en metode der returnerer alle dine brugere, så du har noget at kunne køre igennem andre steder end kun i din BrugerCollection
public ArrayList GetAllUsers() { return brugere; }
din foreach skal se lige have en lille bitte ændring int highest = 0; foreach (Bruger b in brugerCollection.GetAllUsers()) { if (b.GetBrugerNr > highest) highest = b.GetBrugerNr; }
Error 1 Operator '>' cannot be applied to operands of type 'method group' and 'int' C:\Documents and Settings\Hans Ole Andersen\Skrivebord\Sportal\Sportal\Startup.cs 81 21 Sportal
Error 2 Cannot convert method group 'GetBrugerNr' to non-delegate type 'int'. Did you intend to invoke the method? C:\Documents and Settings\Hans Ole Andersen\Skrivebord\Sportal\Sportal\Startup.cs 82 31 Sportal
Kan ikke se at der skulle være den store forskel. I det du opretter en ny bruger må du jo så bare tilføje den til din arraylist, og samtidigt tilføje brugeren i din fil.
Men jeg synes ikke at jeg forstå dit "nye spørgsmål" helt. Det kan være at det er lige et skridt over hvad jeg før har rodet med.
Jamen der var ingen brugere i systemet før :) Har lavet så den ligger 1 til highest hver gang jeg opretter en bruger.. Men for hver eneste bruger jeg opretter for de brugernr 1 hvilket vil sige at highest altid er = 0..
njaa altså har lavet den sådan: //INDLÆS ATTRIBUTTER int brugernr; string navn;
//TJEK HVILKET BRUGERNR DER ER LEDIGT int highest = 0; foreach (Bruger b in brugerCollection.GetAllUsers()) { if (b.GetBrugerNr() > highest) highest = b.GetBrugerNr(); } brugernr = highest + 1;
//KALD NAVN IND FRA BRUGEREN navn = txtFornavn.Text + " " + txtEfternavn.Text;
//OPRET BRUGEROBJEKT bruger = brugerCollection.OpretBruger(brugernr); bruger.SetNavn(navn);
Tror det er nemmere hvis jeg lige poster de 3 filer som de ser ud nu :)
----------------------------------------------- Bruger.CS ----------------------------------------------- using System; using System.Collections.Generic; using System.Text;
namespace Sportal { [Serializable] class Bruger { //ATTRIBUTTER private int brugernr; private string navn;
//PROPERTIES public void SetNavn(string navn) { this.navn = navn; }
public int GetBrugerNr() { return brugernr; } public string GetNavn() { return navn; } } }
----------------------------------------------- BrugerCollection.CS ----------------------------------------------- using System; using System.Collections.Generic; using System.Text; using System.Collections;
namespace Sportal { [Serializable] //SØRGER FOR AT BRUGERCOLLECTION KAN SERIALISERES class BrugerCollection { private ArrayList brugere;
[NonSerialized] //SØRGER FOR AT NÆSTE LINIE IKKE MEDTAGES I SERIALISERINGEN private int aktuelBrugerIdx;
public BrugerCollection() { brugere = new ArrayList(); aktuelBrugerIdx = 0; }
//GEM BRUGERNE I COLLECTION public void GemBrugere(ArrayList users) { brugere = users; }
//HENT ALLE BRUGERE TIL GENNEMLØB public ArrayList GetAllUsers() { return brugere; }
//PRE: BRUGERNR FINDES IKKE I NOGEN ANDRE BRUGERE //POST: BRUGEROBJEKT OPRETTET OG RETURNERET public Bruger OpretBruger(int brugernr) { Bruger bruger = new Bruger(brugernr); brugere.Add(bruger); return bruger; }
//PRE: BRUGERNR FINDES I BRUGERE //POST: INDEX I BRUGERE FOR BRUGER MED BRUGERNR RETURNERET private int GetBrugerIdx(int brugernr) { int i; for (i = 0; i < brugere.Count; i++) { if (brugernr == ((Bruger)brugere[i]).GetBrugerNr()) break; } return i; }
//PRE: BRUGERNR FINDES I BRUGERE //POST: BRUGER MED BRUGERNR SLETTET FRA BRUGERE public void SletBruger(int brugernr) { int index; index = GetBrugerIdx(brugernr); brugere.RemoveAt(index); }
//PRE: BRUGERNR FINDES I BRUGERE //POST: BRUGER MED BRUGERNR RETURNERET public Bruger GetBruger(int brugernr) { int index; index = GetBrugerIdx(brugernr); return (Bruger)(brugere[index]); }
//ITERATOR-METODER (GENNEMLØB AF BRUGERE)
//POST: ITERATOR NULSTILLES (DVS. PEGER PÅ FØRSTE BRUGER) // -- RETURNERER FALSE HVIS DER IKKE ER NOGEN BRUGERE, ELLER TRUE public bool Foerste() { aktuelBrugerIdx = 0; return (brugere.Count > 0); }
//POST: AKTUEL VARE (DEN SOM ITERATOREN PEGER PÅ) RETURNERES public Bruger GetBruger() { return (Bruger)(brugere[aktuelBrugerIdx]); }
//POST: PEGER PÅ NÆSTE BRUGER HVIS DER ER FLERE // - OG RETURNERER TRUE, ELLERS FALSE public bool Naeste() { aktuelBrugerIdx++; return (aktuelBrugerIdx < brugere.Count); } } } ----------------------------------------------- StartUp.CS ----------------------------------------------- using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Collections;
namespace Sportal { public partial class Startup : Form { private const string FILNAVN = "brugere.dat";
public Startup() { InitializeComponent(); OpdaterBrugerListe(); }
public void OpdaterBrugerListe() { //INDLÆS FORNØDNE KLASSER BrugerCollection brugerCollection; Bruger bruger; ArrayList brugere = new ArrayList();
brugerCollection = new BrugerCollection();
//ÅBEN FIL FOR LÆSNING FileStream fileStream = new FileStream(FILNAVN, FileMode.Open, FileAccess.Read);
//TILKNYT BINARY-FORMATER TIL FILESTREAM BinaryFormatter binFormatter = new BinaryFormatter();
//DESERIALISÉR FILESTREAM TIL BRUGERCOLLECTIOn brugerCollection = (BrugerCollection)binFormatter.Deserialize(fileStream);
//LUK FILESTREAM fileStream.Close();
//GENNEMLØB ITERATOR OG INDSÆT BRUGERE I COMBOBOKSEN string navn; int brugernr; if (brugerCollection.Foerste()) { do { bruger = brugerCollection.GetBruger(); navn = bruger.GetNavn(); brugernr = bruger.GetBrugerNr(); brugere.Add(bruger); cbVælgBruger.Items.Add(navn + " (" + brugernr.ToString() + ")"); } while (brugerCollection.Naeste()); } }
private void btnOpretBruger_Click(object sender, EventArgs e) { //KALD DE FORNØDNE KLASSER BrugerCollection brugerCollection; Bruger bruger; brugerCollection = new BrugerCollection();
//INDLÆS ATTRIBUTTER int brugernr; string navn;
//TJEK HVILKET BRUGERNR DER ER LEDIGT int highest = 0; foreach (Bruger b in brugerCollection.GetAllUsers()) { if (b.GetBrugerNr() > highest) highest = b.GetBrugerNr(); } brugernr = highest + 1;
//KALD NAVN IND FRA BRUGEREN navn = txtFornavn.Text + " " + txtEfternavn.Text;
//OPRET BRUGEROBJEKT bruger = brugerCollection.OpretBruger(brugernr); bruger.SetNavn(navn);
MessageBox.Show("Bruger oprettet med ID: #" + brugernr);
//SKAB FIL FOR SKRIVNING FileStream filestream = new FileStream(FILNAVN, FileMode.Create, FileAccess.Write);
//TILKNYT BINARY-FORMATER TIL FILESTREAM BinaryFormatter binFormatter = new BinaryFormatter();
//SERIALISÉR BRUGERCOLLECTION TIL FILESTREAM binFormatter.Serialize(filestream, brugerCollection);
//GENNEMLØB ITERATOR OG INDSÆT BRUGERE I COMBOBOKSEN string navn; int brugernr; if (brugerCollection.Foerste()) { do { bruger = brugerCollection.GetBruger(); navn = bruger.GetNavn(); brugernr = bruger.GetBrugerNr(); brugere.Add(bruger); cbVælgBruger.Items.Add(navn + " (" + brugernr.ToString() + ")"); } while (brugerCollection.Naeste()); }
->
//GENNEMLØB ITERATOR OG INDSÆT BRUGERE I COMBOBOKSEN string navn; int brugernr; if (brugerCollection.Foerste()) { do { bruger = brugerCollection.GetBruger(); navn = bruger.GetNavn(); brugernr = bruger.GetBrugerNr(); brugere.Add(bruger); cbVælgBruger.Items.Add(navn + " (" + brugernr.ToString() + ")"); } while (brugerCollection.Naeste()); brugerCollection.SaveUsers(brugere); }
public void Main() { BrugerCollection brugerCollection = new BrugerCollection(); Bruger bruger; ArrayList brugere = new ArrayList();
string navn; int brugernr; if (brugerCollection.Foerste()) { do { bruger = brugerCollection.GetBruger(); navn = bruger.GetNavn(); brugernr = bruger.GetBrugerNr(); brugere.Add(bruger); cbVælgBruger.Items.Add(navn + " (" + brugernr.ToString() + ")"); } while (brugerCollection.Naeste());
}
foreach (Bruger b in brugere) { Console.WriteLine("{0}:{1}", bruger.GetNavn(), bruger.GetBrugerNr()); } }
Prøv at tilføje en consol applikation til dit projekt, og sætte det til at være startup projektet. Deri laver du så lidt test. Deri prøver du så at udskrive alle dine brugere med en foreach.
Collection: public bool TestBrugerNr(int testnr) { int x = 0; foreach (Bruger b in brugere) { if (b.GetBrugerNr() == testnr) x++; } if (x > 0) return false; else return true; }
StartUp: Random rnd = new Random(DateTime.Now.Millisecond); int testnr; testnr = rnd.Next(0,999);
Denne mulighed er naturligvis ikke helt optimal i mange tilfælde da den jo sætter en begrænsing på antallet af brugere der kan oprettes..
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.