login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[C#] foreach syntax

Offline Ultimatum - 22/05/2009 13:52
Avatar van UltimatumPHP expert Ey, de volgende foreach syntax is heel gebruikelijk in php
  1. <?php
  2. foreach($array as $key => $value) { }
  3. ?>


Maar is dit ook mogelijk in C#? Want ik moet dus de key van een List in C# laten zien, ik doe dit nu als volgt:
  1. int i = 0;
  2. List<Email> emails = getInboxEmails();
  3. foreach (Email email in emails) {
  4. i++;
  5. }


Kan ik dit dus efficienter doen in C#, zoals in php? Google leverd voor alsnog niets op.

5 antwoorden

Gesponsorde links
Offline urqbz - 22/05/2009 15:00 (laatste wijziging 23/05/2009 13:46)
Avatar van urqbz PHP interesse Ik denk niet dat dat nog korter kan
Correct me if i'm wrong
titjes schreef:
t.Reacties[0].Poster = "DOM";
Offline Ultimatum - 22/05/2009 15:07 (laatste wijziging 22/05/2009 15:07)
Avatar van Ultimatum PHP expert No offence, maar aan dit antwoord heb ik niets, want zover was ik namelijk ook al.

Heb ondertussen dit al gevonden:
  1. foreach (KeyValuePair<int, string> attachment in attachments)
  2. {
  3. MessageBox.Show(String.Format("{0},{1}", pair.Key, pair.Value));
  4. }


Maar dan krijg ik deze error, is opzich wel logisch omdat attachments een object is. Kan ik dit stukje ombouwen dat het met een object overweg kan?

Dit is de error die ik krijg:
Citaat:
Error 1 Cannot convert type 'Outlook2007Project.Attachment' to 'System.Collections.Generic.KeyValuePair<int,string>' Outlook Project Backup.cs 86 21 Outlook Project Backup
Offline Abbas - 23/05/2009 13:25
Avatar van Abbas Gouden medaille

Crew .NET
Wat je wel kan doen is anders met een Dictionary werken, dit is niet zo heel verschillend en je kan er gemakkelijk de KeyValuePair op toepassen. Je geeft tussen de haakjes de Key en de Value al mee, de Value is in jouw geval van het type 'Attachment. Klein voorbeeldje:

  1. //Nieuwe Dictionary, Key is int en Value is Mail
  2. Dictionary<int, Mail> lstMail = new Dictionary<int, Mail>();
  3. //Nieuw Mail-object
  4. Mail m;
  5.  
  6. private void Form1_Load(object sender, EventArgs e)
  7. {
  8. //Aan de lijst een Key toevoegen en dan telkens een nieuwe Mail
  9. lstMail.Add(1, new Mail(1, "test", "sadfasd", true, "blaat"));
  10. lstMail.Add(2, new Mail(6, "asdf", "asfdasd", false, String.Empty));
  11. lstMail.Add(3, new Mail(3, "jhgk", "lhjkllk", false, String.Empty));
  12. lstMail.Add(4, new Mail(9, "eyty", "swerttr", true, "blaat"));
  13. lstMail.Add(5, new Mail(8, "zxvc", "zcvxzcv", true, "blaat"));
  14. lstMail.Add(6, new Mail(2, "erbh", "vwevwff", false, String.Empty));
  15. }
  16.  
  17. private void button1_Click(object sender, EventArgs e)
  18. {
  19. //Loopen door de lijst
  20. foreach (KeyValuePair<int, Mail> mail in lstMail)
  21. //De Key weergeven en van de Value (Mail) alleen het Subject
  22. MessageBox.Show("Key: " + mail.Key + ", Value: " + mail.Value.Subject);
  23. }

Ik hoop dat je er aan uit kan! 
Offline Ultimatum - 23/05/2009 17:59 (laatste wijziging 25/05/2009 09:44)
Avatar van Ultimatum PHP expert Ah, dat is ook wel een oplossing. Maandag even uitproberen .

Nog even een vraagje, kan het ook zonderdat ik de key toevoeg? Dus dat die automatisch optelt zoals in php? Want anders moet ik alsnog een var maken die ik binnen de foreach (waar ik de nieuwe Dictionary maak) gebruik en steeds optel.

En als ik wil kijken of de key/value al bestaat, hoe doe ik dat dan? Want hier haal ik alle projectnummers op en wil ik kijken of ze al in de Dictionary staan. Maar krijg dus een fout waar ik ContainsValue() (regel 13) gebruik omdat de value een Projectnumbers object is maar ik dat ga vergelijken met een string. Hoe los ik dit op?

  1. try
  2. {
  3. this._projectNumbers = new Dictionary<int, ProjectNumbers>();
  4.  
  5. this._connection.Open();
  6.  
  7. MySqlCommand select = new MySqlCommand("SELECT projectnummer, naam FROM wm_Projecten ORDER BY projectnummer ASC", this._connection);
  8. MySqlDataReader reader = select.ExecuteReader();
  9.  
  10. int i = 0;
  11. while (reader.Read())
  12. {
  13. if (this._projectNumbers.ContainsValue(reader.GetString("projectnummer")) == false)
  14. {
  15. ProjectNumbers projectnumbers = new ProjectNumbers();
  16. projectnumbers.projectname = reader.GetString("naam");
  17. projectnumbers.projectnumber = reader.GetString("projectnummer");
  18.  
  19. this._projectNumbers.Add(i++, projectnumbers);
  20. }
  21. }
  22. reader.Close();
  23. }
  24. catch (Exception x)
  25. {
  26. _log.writeError(x);
  27. }
  28. finally
  29. {
  30. this._connection.Close();
  31. }


En op regel 10 moet ik alsnog eerst i declareren en dan i++ doen, dit kan zeker niet makkelijker?
Offline rambo - 03/07/2009 17:11 (laatste wijziging 03/07/2009 17:12)
Avatar van rambo HTML beginner Je ziet het eerst declareren van variabelen hier als nadeel, maar dit is juist een voordeel tov PHP. Op deze manier krijg je geen onverwacht gedrag van je applicatie maar bepaal je van te voren welk datatype en waarde een variabele moet hebben.

Over je andere vraag: een Dictionary wordt gebruikt om aan de hand van een key een bepaalde waarde op te zoeken. Wanneer je dan ook iets wil toevoegen dan controleer je of de key al voorkomt in de Dictionary (met behulp van .ContainsKey()). Wanneer dit niet zo is dan voeg je hem toe. Je controleert dus niet op de Value zoals jij nu doet. Tenminste, dit is niet de toepassing waarvoor een Dictionary gemaakt is. Je gaat ook geen Engels - Nederlands woordenboek kopen omdat je een woord van het Nederlands naar het Engels wilt vertalen...

Om vervolgens door je Dictionary heen te loopen en de keys te verkrijgen die je toegevoegd hebt, kun je de volgende code gebruiken:

  1. foreach (KeyValuePair keyValuePair in this._projectNumbers)
  2. {
  3. int key = keyValuePair.Key;
  4. ProjectNumbers projectNumbers = keyValuePair.Value;
  5. }
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.184s