Avatar billede mettegp Nybegynder
18. september 2005 - 11:25 Der er 5 kommentarer

Array Gymnastik

Hej
Jeg har lavet et mail program, hvor afsendere kan sende mails til mig. Jeg finder afsender ved at indlæse fra en mySQL database ved brug af Idatareader. Jeg finder antallet af mails pr afsender gennem metoden GentAntalMailsPrAfsender
Disse værdier indlæses i et data transport objekt mailDTO.
Mit problem er nu, at hvis peter har sendt mig 5 mails, så står der peter 5, 5 gange. Og da jeg skal sortere og finde de 3 afsendere som har sendt flest mails, skal jeg bruge et array, hvor afsenderne kun optræder en gang. Dvs.
peter 5
anna 4
troels 3
nede i forlykken har jeg forsøgt noget men det virker ikke rigtigt. Så mit spørgsmål er, hvordan fjerner jeg de 4 andre forekomster af peter 5, så han kun optræder en gang og sorterer så han der har sendt flest mails står først?
I metoden her har jeg sorteret efter afsender.
Jeg er i tvivl om man kan bruge IComparer. Den opererer med nøgler og kan vist sortere i descending order.

public FlestMailsDTO[] GetAntalMailsPrAfsender(string mailAdresse_til)
{
        IDataReader mailDataReader;
        MailGateway mailGW;
        FlestMailsDTO mailDTO;

        //Data Transfer Objekt
    ArrayList mailArr;
    FlestMailsDTO[] flestMailsDTOArr;   
        //Array af Data Transfer Objekter
    string afsender = null;

    //skaber nyt array af mailDTO'er
    mailGW = new MailGateway();
    mailGW.OpenConnection();
    mailDataReader = mailGW.FindEmails(mailAdresse_til);

    mailArr = new ArrayList();
    while(mailDataReader.Read() == true)
    {                   
    mailDTO = new FlestMailsDTO();
    mailDTO.mailAdresse_fra = (string)mailDataReader    ["afsender"];
    afsender = mailDTO.mailAdresse_fra;
    mailDTO.antal = MailTM.GetAntalMailsPrAfsender(mailAdresse_til, afsender);
    mailArr.Add(mailDTO);
    }
    flestMailsDTOArr = (FlestMailsDTO[])mailArr.ToArray(typeof(FlestMailsDTO));
    Array.Sort(flestMailsDTOArr);
           
        for(int i = 1; i < flestMailsDTOArr.Length;i++)
    {
    if(flestMailsDTOArr[i].mailAdresse_fra.Equals(afsender))
    {
    flestMailsDTOArr[i]=flestMailsDTOArr[i-(i-1)];
    }
        }
    mailGW.CloseConnection();
    return flestMailsDTOArr;
    }
Avatar billede nielle Nybegynder
18. september 2005 - 19:07 #1
Kan du ikke lige poste noget kode for din MailGateway - jeg tror at problemet skal løses inden i kaldet til

mailGW.FindEmails(mailAdresse_til);
Avatar billede mettegp Nybegynder
18. september 2005 - 20:59 #2
Hej nielle
Hermed fremsender jeg dig min FindEmails metode som ligger i min gateway
Jeg sender dig også koden til min TableDataGateway som class MailGateway arver fra
Desuden har jeg sendt dig koden til GetAntalMailsPrAfsender som ligger i class MailTM
Så har jeg vist sendt dig al den kode jeg bruger i denne metode

public class MailGateway : TableDataGateway
{
public IDataReader FindEmails(string mailAdresse_til)
{
    MySqlDataReader dataReader;
    string sqlStr;
    sqlStr = "SELECT * FROM email ";
    sqlStr += "WHERE modtager = '" + mailAdresse_til + "'";
        cmd.CommandText = sqlStr;

    dataReader = cmd.ExecuteReader();
    return dataReader;
}
}

public abstract class TableDataGateway
{
        protected MySqlConnection con;
    protected MySqlCommand cmd;
    protected string tabel;

    //konstruktør
    public TableDataGateway(string tabel)
    {
        string connectionStr;
        this.tabel = tabel;
        connectionStr = "Database=emailListe;Data Source=localhost";

        //skab forbindelses-objekt udfra connectionsStr
        con = new MySqlConnection(connectionStr);

        //skab kommando-objekt og tilknyt til forbindelses-objekt
        cmd = new MySqlCommand();
        cmd.Connection = con;
    }

    public IDataReader FindAll()
    {
        MySqlDataReader dataReader;
        cmd.CommandText = "SELECT * FROM " + tabel;
        //open
        dataReader = cmd.ExecuteReader();
        //close
        return dataReader;
    }

    public void OpenConnection()
    {
        con.Open();
    }

    public void CloseConnection()
    {
        con.Close();
    }
    }


public class MailTM //Table Module
{
public static int GetAntalMailsPrAfsender(string mailAdresse_til, string mailAdresse_fra)
{
    IDataReader mailDataReader;
    int antal = 0;
    //int maxAntal = 0;
       
    MailGateway mailGW = new MailGateway();
    mailGW.OpenConnection();
    mailDataReader = mailGW.FindEmails(mailAdresse_til);           
    while(mailDataReader.Read() == true)
    {
    if(mailAdresse_fra.Equals(mailDataReader["afsender"]))
    {
    antal++;   
//    maxAntal = antal;       
//finder den afsender der har sendt flest mails  //dette er udkommenteret, da jeg
//                              //skal finde de 3 afsendere der har
//    if(antal > maxAntal)                      //sendt flest mails
//    {
//        maxAntal = antal;
//    }           
    }
    }
           
    mailGW.CloseConnection();
    return antal;
    }
}
Avatar billede nielle Nybegynder
18. september 2005 - 21:08 #3
Prøv at rette din FindEmails() til dette:

public IDataReader FindEmails(string mailAdresse_til)
{
    MySqlDataReader dataReader;
    string sqlStr;
    sqlStr = "SELECT DISTINCT afsender FROM email WHERE modtager = '" + mailAdresse_til + "'";
    cmd.CommandText = sqlStr;

    dataReader = cmd.ExecuteReader();
    return dataReader;
}
Avatar billede nielle Nybegynder
26. september 2005 - 22:43 #4
Har du fået kigget på det?
Avatar billede nielle Nybegynder
18. oktober 2005 - 22:37 #5
?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester