login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[C#] Waarde uit array zoeken in string (Opgelost)

Offline Ultimatum - 31/10/2008 09:00
Avatar van UltimatumPHP expert Beetje onduidelijke titel maar beter kan ik het niet zo kort omschrijven. Ik heb het volgende probleem, ik heb een string waar wel of niet een projectnummer in staat. Nu heb ik een arraylist met alle projectnummers en moet ik in de string gaan kijken of er een projectnummer is en of die in arraylist staat.

Dat kan heel makkelijk met een foreach, gewoon alle projecten uitlezen en in die foreach per value in de arraylist gaan kijken of het ook in de string staat. Maar als ik nu 50 strings moet gaan kijken en er zitten 100 items in de arraylist moet ik dus 50 keer 100 keer door de array loopen. Dit is dus niet echt effecient.

Heeft iemand dus een effiecente oplossing voor mij?

17 antwoorden

Gesponsorde links
Offline nemesiskoen - 31/10/2008 10:19
Avatar van nemesiskoen Gouden medaille

PHP expert
Even heel klein vraagje: hoe ziet zo'n string er uit?
Als de enige getallen die er in voorkomen de projectnummers kunnen zijn kan je die er ook uitfilteren en dan tegen de arraylist houden.
Offline Ultimatum - 02/11/2008 13:22
Avatar van Ultimatum PHP expert Sorry voor late reactie. De projectnummers bestaan altijd uit 3 letters en daarna 5 cijfers. Maar het projectnummer kan vooraan, middenin of achteraan de string staan, weet dus niet hoe ik dat kan filteren.
Offline Abbas - 02/11/2008 16:42 (laatste wijziging 02/11/2008 16:43)
Avatar van Abbas Gouden medaille

Crew .NET
Misschien kan je al wat zoekwerk tegen de arraylist "uitschakelen" door alle strings er uit te filteren die geen projectnummer hebben. Degene die dat wel hebben kan je dan tegen de arraylist gooien om te kijken of die erin staat.

Edit:
Hm, looks a bit like what vage said.. Sorry!
Offline Ultimatum - 02/11/2008 17:16
Avatar van Ultimatum PHP expert
Citaat:
Misschien kan je al wat zoekwerk tegen de arraylist "uitschakelen" door alle strings er uit te filteren die geen projectnummer hebben.

Dat is precies het punt dat ik wil doen, maar ik weet niet hoe ik het projectnummer uit de string kan halen.
Offline Abbas - 02/11/2008 18:02
Avatar van Abbas Gouden medaille

Crew .NET
Geef dan eens een paar voorbeelden van hoe zo'n string er kan uitzien, een paar met en zonder die projectnummer erin.
Offline Ultimatum - 02/11/2008 18:04
Avatar van Ultimatum PHP expert Zal morgen even laten zien want het is een project van mijn werk dus heb nu even geen voorbeelden. Maar meestal is het iets in deze richting:
HOS4685134 | Een string
String | HOS4685134 Andere string
Offline Abbas - 02/11/2008 18:05
Avatar van Abbas Gouden medaille

Crew .NET
Begint een projectnummer altijd met "HOS"?
Offline Ultimatum - 02/11/2008 18:06
Avatar van Ultimatum PHP expert Nee, er zijn 103 verschillende projectnummers. Maar een projectnummer is altijd 3 letters, 5 cijfers.
Offline Abbas - 02/11/2008 18:07
Avatar van Abbas Gouden medaille

Crew .NET
En die projectnummer kan "omgeven" zijn door andere letters?
Offline Ultimatum - 02/11/2008 18:08
Avatar van Ultimatum PHP expert Hoe bedoel je, meestal staat projectnummer vooraan de string maar het kan ook midden in een string staan of erachter.
Offline Abbas - 02/11/2008 18:16
Avatar van Abbas Gouden medaille

Crew .NET
Een string bevat cijfers en letters, dus als de projectnummer in die string zit, staan ervoor en/of erachter (=omgeven door, cfr. Engels: surrounded by ) toch nog letters/cijfers.
Offline zwobbel - 02/11/2008 23:17
Avatar van zwobbel PHP gevorderde Waarom kan ik niet terug gaan naar de vorige pagina met andere replys bij deze topic?
Offline Abbas - 03/11/2008 00:50
Avatar van Abbas Gouden medaille

Crew .NET
Jij niet alleen! :o
Offline Stijn - 03/11/2008 01:00 (laatste wijziging 03/11/2008 01:01)
Avatar van Stijn PHP expert Kijk eens in je URL, die # zal er voor iets tussen zitten. Je kan dit zien bij de andere topics met een # in hun titel.
Offline Ultimatum - 03/11/2008 07:31 (laatste wijziging 03/11/2008 11:06)
Avatar van Ultimatum PHP expert Deze url werkt mochten mensen het nog niet uitgevonden hebben .
http://www.site...n_string/1
Ik zal straks even code hier neerzetten die werkt, maar waar ik wel een foreach bij gebruik dus niet echt efficient.

Dit is de C# code die ik nu heb.

  1. private int getProjectnummerFromSubject(string Subject)
  2. {
  3. int iProjectnummerIndex = -1;
  4.  
  5. foreach (string projectnummer in Ribbon.projectnummers)
  6. {
  7. if (Subject.IndexOf(projectnummer) != -1)
  8. {
  9. iProjectnummerIndex = Subject.IndexOf(projectnummer);
  10. }
  11. }
  12.  
  13. return iProjectnummerIndex;
  14. }


En zo gebruik ik het
  1. Outlook.MAPIFolder SentFolder = Globals.ThisAddIn.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail);
  2. foreach (object obj in SentFolder.Items)
  3. {
  4. Outlook.MailItem MailItems = obj as Outlook.MailItem;
  5.  
  6. if (MailItems != null && String.IsNullOrEmpty(MailItems.Subject) == false && getProjectnummerFromSubject(MailItems.Subject) != -1)
  7. {


Dus als ik 50 mails heb, dan moet ik dus 50 keer een foreach aanroepen dus elke keer door 100 items loopen die in een arraylist staan. En ik houd er rekening mee dat er gebruikers zijn met 1000+ emails waarvan er elke dag minstens 50 nieuwe bij komen. Dus als het elke keer 5 minuten duurt om alle mails te doorlopen is dat niet echt snel. Is er dus een snellere manier om waardes uit een array te vergelijken met een string? Dus zonder te loopen.
Offline Abbas - 03/11/2008 12:20 (laatste wijziging 03/11/2008 12:22)
Avatar van Abbas Gouden medaille

Crew .NET
Je kan niet echt veel anders doen want je zult de twee arrays moeten doorlopen om te controleren op die projectnummer. Het enige dat ik direct zie om nog tijd te besparen is in je functie. Hier loop jij door de projectnummers om te zien of het "Subject" die nummer bevat. Maar zelfs al bevat hij die nummer, dan nog blijf jij verder loopen tot het einde. Je vertelde dat er 103 projectnummers zijn, stel dan dat een "Subject" het eerste projectnummer al heeft, dan ga jij nog 102 keer de controle doen. Je lost dit op door direct een return te doen met de IndexOf() van het nummer in het "Subject". Ik heb ook op de controle zelf gebruik gemaakt van de functie Contains(), bevat het "Subject" een projectnummer dan pas ga je IndexOf() gebruiken om terug te sturen.

  1. private int getProjectnummerFromSubject(string Subject)
  2. {
  3. //Je krijgt een "Subject" binnen en gaat controleren via de loop
  4. //of het een projectnummer bevat
  5. foreach (string projectnummer in Ribbon.projectnummers)
  6. //Als "Subject" een projectnummer bevat
  7. if (Subject.Contains(projectnummer))
  8. //Direct return doen waardoor je niet verder loopt en
  9. //meteen uit de functie springt mét de IndexOf()
  10. return Subject.IndexOf(projectnummer);
  11. //Als er geen is gevonden, -1 terugsturen
  12. return -1;
  13. }
  14.  
  15. //Zonder Commentaar ertussen:
  16. private int getProjectnummerFromSubject(string Subject)
  17. {
  18. foreach (string projectnummer in Ribbon.projectnummers)
  19. if (Subject.Contains(projectnummer))
  20. return Subject.IndexOf(projectnummer);
  21. return -1;
  22. }

Ik zie niet meteen een oplossing die dit véél sneller kan maken, maar de functie die ik je gaf zal al wel een heel pak tijd schelen! 
Offline Ultimatum - 03/11/2008 13:46
Avatar van Ultimatum PHP expert Dankje, als het alleen maar op deze manier kan dan heb ik pech gehad . Bedankt voor je aanpassing op mijn functie. Ik sluit dit topic nu maar als ik ooit een oplossing vind dan voeg ik die hier wel toe. Bedankt iedereen voor meedenken enzo 
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.22s