C# Verständnisfrage

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    C# Verständnisfrage

    Hi,
    ich arbeite mich gerade erst in C# ein. Nun hab ich mir ein kleines Projekt vorgenommen, wo ich Termine eines Besprechungsraums abfragen möchte und später grafisch darstellen möchte ob der Raum zur Zeit frei ist oder nicht.
    So, also hab ich folgende Klasse erstellt:

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Net;
    5. using Microsoft.Exchange.WebServices.Data;
    6. namespace EWS
    7. {
    8. class EWSConnect
    9. {
    10. public string mailBox { get; set; }
    11. public string user { get; set; }
    12. public string pass { get; set; }
    13. public string domain { get; set; }
    14. const int numAppts = 10;
    15. static DateTime startDate = DateTime.Now;
    16. static DateTime endDate = startDate.AddDays(30);
    17. public EWSConnect(string mailBox, string user, string pass, string domain)
    18. {
    19. this.mailBox = mailBox;
    20. this.user = user;
    21. this.pass = pass;
    22. this.domain = domain;
    23. }
    24. public IEnumerable<Appointment> GetAppointments()
    25. {
    26. NetworkCredential netCred = new NetworkCredential(this.user, this.pass, this.domain);
    27. ExchangeVersion exVers = ExchangeVersion.Exchange2013;
    28. ExchangeService exService = new ExchangeService(exVers);
    29. exService.Credentials = netCred;
    30. exService.AutodiscoverUrl(this.mailBox);
    31. CalendarFolder calFolder = CalendarFolder.Bind(exService, WellKnownFolderName.Calendar);
    32. CalendarView calView = new CalendarView(startDate, endDate, numAppts);
    33. calView.PropertySet = new PropertySet(ItemSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End);
    34. FindItemsResults<Appointment> appointments = calFolder.FindAppointments(calView);
    35. return appointments;
    36. }
    37. public bool RoomFree()
    38. {
    39. DateTime timeNow = DateTime.Now;
    40. IEnumerable<Appointment> currAppt = from res in GetAppointments() where res.Start <= timeNow && res.End > timeNow + res.Duration select res;
    41. if (currAppt != null)
    42. {
    43. return false;
    44. }
    45. else
    46. {
    47. return true;
    48. }
    49. }
    50. }
    51. }

    Soweit funktioniert auch die Abfrage:

    C#-Quellcode

    1. using Microsoft.Exchange.WebServices.Data;
    2. using System;
    3. namespace EWS
    4. {
    5. class Program
    6. {
    7. static void Main(string[] args)
    8. {
    9. EWSConnect con = new EWSConnect("EmailAddi", "Username", "Password", "Domain");
    10. bool roomFree = con.RoomFree();
    11. Console.WriteLine(roomFree);
    12. foreach (Appointment a in con.GetAppointments())
    13. {
    14. Console.WriteLine($"Betreff: {a.Subject}");
    15. Console.WriteLine($"Beginn: {a.Start}");
    16. Console.WriteLine($"Ende: {a.End}");
    17. }
    18. }
    19. }
    20. }


    Termine werden auf der Console angezeigt.
    Was leider nicht richtig angezeigt wird ist, ob der Raum zur Zeit frei ist oder nicht.
    Egal was ich mit dem Datum (timeNow) anstelle es kommt immer False raus.
    Wo ist da mein Denkfehler?
    Danke Euch
    Bilder
    • EWS.PNG

      21,97 kB, 1.542×312, 57 mal angesehen
    "Hier könnte Ihre Werbung stehen..."
    @MichaHo Mach mal aus den statischen Variablen startDate und endDate Properties.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo @RodFromGermany: hab ich jetzt so:

    C#-Quellcode

    1. public DateTime startDate{ get; set; }
    2. public DateTime endDate { get; set; }
    3. public EWSConnect(string mailBox, string user, string pass, string domain)
    4. {
    5. this.mailBox = mailBox;
    6. this.user = user;
    7. this.pass = pass;
    8. this.domain = domain;
    9. this.startDate = DateTime.Now;
    10. this.endDate = this.startDate.AddDays(30);
    11. }
    geändert.
    Erhalte dennoch false obwohl true zurück kommen müsste (erster Termin ist heute um 13:00 Uhr)
    "Hier könnte Ihre Werbung stehen..."
    @mikeb69 also ich hab es jetzt mal so temporär gemacht:

    C#-Quellcode

    1. public bool RoomFree()
    2. {
    3. DateTime timeNow = DateTime.Now;
    4. DateTime endAppt = new DateTime(2017,3,14,14,0,0);
    5. IEnumerable<Appointment> currAppt = from res in GetAppointments() where res.Start <= timeNow && res.End >= endAppt select res;
    6. if (currAppt != null)
    7. {
    8. return false;
    9. }
    10. else
    11. {
    12. return true;
    13. }
    14. }

    kommt dennoch false raus. also der nächste Termin in diesem Raum ist 14.03.2017 13:00 - 14:00 Uhr. jetzt ist es 12:32 Uhr und somit sollte der Raum frei sein.
    Ich vermute es liegt an der LinQ Abfrage....
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    Ich vermute es liegt an der LinQ Abfrage.
    Vielleicht progst Du den Algorithmus (zunächst) mal zu Fuß, da lässt es sich noch debuggen, wenn es nicht funktioniert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    C#-Quellcode

    1. IEnumerable<Appointment> currAppt = from res in GetAppointments() where res.Start <= timeNow && res.End > timeNow + res.Duration select res;



    Diese LINQ Query wird niemals null zurück geben. Du solltest mit .Any() prüfen ob sich Elemente in der Aufzählung befinden.
    @RodFromGermany bin ich grad dabei :)
    @Solaris: ja, ich bin mir sicher das es komplett falsch ist, weis aber grad absolut nicht, wie ich es anders raus bekomme. P.S. es sind definitiv Elemente in der Liste, wollte mit dem LinQ nur die Liste auf einen Termin einstampfen, nämlich dem Termin, der gerade besteht

    Auch mit dem Hinweis von Rod, das ganze zu Fuss zu machen blick ich nicht ganz durch (also bei der Logik).

    Ich versuchs nochmal kurz zusammen zu fassen (dann versteh ich es vielleicht auch :-)), also. ich hole mir alle Termine des Besprechungsraums von gestern bis in 30 Tagen (wobei auch 14 Tage reichen oder gar 7, soll aber später noch für eine InfoTafel genutzt werden). DER Punkt klappt ja soweit bestens...
    Jetzt möchte ich aus der Liste der Termine DEN Termin raus suchen, der quasi zum Zeitpunkt der Abfrage besteht. DANN ist der Raum nämlich belegt und gut ist. Gibt es da keinen Termin, ist der Raum frei.

    Fürs erste ist es dann gut so, später wäre es noch gut wenn dann eine Info drunter stehen würde, welches die nächsten Termine sind...
    Wie kann ich also über LinQ oder zu Fuss oder wie auch immer in der Liste die Termine raus filtern, die zum Abfragezeitpunkt bestehen.
    Ich müsste irgendwie ne Abfrage haben wie: Wenn der jetzige Zeitpunkt(timeNow) zwischen Termin.Start und Termin.Ende Dann RaumBelegt; sonst RaumFrei

    Wenn das alles soweit klappt, möchte ich das gerne für alle Besprechungsräume(4) und alle Fahrzeuge(6) im Intervall von 15 Minuten abfragen und auf einem Monitor ausgeben.
    "Hier könnte Ihre Werbung stehen..."
    Ich habe jetzt nicht genau überprüft ob deine Query richtig ist, aber eigentlich sollte es reichen wenn du den Check auf null wie folgt abänderst:

    C#-Quellcode

    1. IEnumerable<Appointment> currAppt = from res in GetAppointments() where res.Start <= timeNow && res.End > timeNow + res.Duration select res;
    2. if (currAppt.Any())
    3. {
    4. return false;
    5. }
    dann kommt immer True raus obwohl der Raum zum jetzigen Zeitpunkt belegt ist...
    Also muss ich nochmal die Query ausbaldovern...

    EDIT:
    Ich glaub ich habs....

    C#-Quellcode

    1. IEnumerable<Appointment> currAppt = from res in GetAppointments() where timeNow > res.Start && timeNow < res.End select res;

    damit bekomme ich False wenn timeNow JETZT ist

    C#-Quellcode

    1. DateTime timeNow = DateTime.Now;
    und True wenn timeNow heute um 12:00 Uhr ist

    C#-Quellcode

    1. DateTime timeNow = new DateTime(2017,3,14,12,0,0);

    Ich teste das jetzt mal mit den anderen Räumen und dann geht´s an die Gui :)
    Danke Euch

    "Hier könnte Ihre Werbung stehen..."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MichaHo“ ()

    Hallo nochmal,
    hab da kurz eine Frage allgemein zu C#.
    Ich möchte gerne ein Public Property haben um über eine instanz diese auszulesen. Sie darf aber nicht überschreibbar sein.
    Die Property sollte nur über die Klasse selbst überschreibbar sein.

    Wie mach ich das?
    Wenn ich nur

    C#-Quellcode

    1. public bool roomFree{get;}
    setze, kann ich innerhalb der Klasse roomFree nicht setzen, auch nicht mit this davor....
    "Hier könnte Ihre Werbung stehen..."
    Bin in C# gerade nicht so drin, aber brauchst du nicht eine private bool die du im get der roomFree übergibst?
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    @Schamash genau so hab ich es jetzt erstmal gemacht:

    C#-Quellcode

    1. //Field
    2. bool roomFree = false;
    3. //Property
    4. public bool IsRoomFree { get { return this.roomFree; } }

    dachte nur es gibt da etwas kürzeres :)

    P:S: bitte nicht erschlagen wegen den Kommentaren :) brauch ich am Anfang....
    Finde C# aber sehr schön, muss mich nur etwas umstellen :)
    "Hier könnte Ihre Werbung stehen..."
    Ungetested:

    C#-Quellcode

    1. public String roomFree { get; private set; }
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."