Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:

THEMA: C# Dictionary<int, datetime>

C# Dictionary<int, datetime> 4 Jahre 2 Monate her #3496

  • ay
  • ays Avatar
  • OFFLINE
  • Fresh Boarder
  • Beiträge: 1
  • Karma: 0
Hallo zusammen,
ich habe zwar das Forum durchsucht aber ich finde leider keine Lösung.

Mein Problem:

Ich erstelle ein Programm, wo der User Daten eingibt und diese Daten werden in eine xml aufgelisttet. Das funktioniert alles soweit sogut.

Ich habe in der XML einen Knoten mit integer, das soll der USER aber nicht beeinflussen können.
Da muss eine Zahl XXX stehen und diese Zahl ist verknüpft mit einem DATUM, was der USER in der Maske eingibt.

Ich habe 10 dieser XXX Zahlen.
INT | DATE
xx1 | 19.07.2015
xx2 | 21.08.2015
xx3 | ...
usw.

Ich möchte aber, dass XX1 bis 19.07. nicht mehr vergeben werden kann. und XX2 bis 21.08.
Bei der Eingabe soll dann das Datum, was der USER auswählt, der XX3 zugewiesen werden. Ab morgen(20.07.) soll dann xx1 wieder verwenbar sein. D.h. wenn ich der Maske wieder was eingebe, kann der INTWert xx1 wieder mit einem Datum geblockt werden. Und nach diesem Datum wieder freigeben. USW USW..

Ich habe leider keine Ahnung, wie ich das Anrichten soll...
Ich habe mir mal paar Sachen durchgelesen aber ich komme nicht zu meinem Ziel.

Es wäre super, wenn man mir Detailiert erläutern könnte, wie man sowas anstellt.

Ich danke im Voraus

C# Dictionary<int, datetime> 4 Jahre 1 Monat her #3499

  • Jonny132
  • Jonny132s Avatar
  • OFFLINE
  • Administrator
  • Beiträge: 151
  • Dank erhalten: 3
  • Karma: 4
Hallo,

ein Dictionary besteht immer aus einem KeyValuePair. Das heißt du kannst nie zwei mal den gleichen Wert als Key eingeben. Du musst also eine andere Struktur nehmen um das Abbilden zu können (evtl. eine eigene Klasse).

Die Abfrage ob ein Wert eingegeben werden darf ist relativ einfach:
private bool CanInsert(int value)
{
  if(listOrDictionary.Where(i=>i.Value==value &&
                            i.Date>=DateTime.Now).Count > 0)
  {
    return false;
  }
  return true;
}

C# Dictionary<int, datetime> 4 Jahre 1 Monat her #3500

  • Anonym
  • Anonyms Avatar
Hi Jonny22,
erst ein mal danke, dass du mir das erklärt hast.

Ich habe mittlerweile eine 2. XML angelegt und da habe ich nun alle INTs, die ich habe eingetragen. So ich lese die erste INT aus und kann es auch in meine 1. XML reinschreiben.

Aber ich bin so verzweifelt, dass ich einfach nicht mehr weiss, wie ich das mache...also die INTs werden EANs sein.
...
List<string> used_ean_list = new List<string>();
...
 private string ean()
        {
            string ean = "";
            string ean_in_use = "";
            int v = 1;
            try
            {
                XmlDocument xml = new XmlDocument();
 
                xml.XmlResolver = null;
 
                xml.Load(@"C:\ean_pool.xml");
 
                foreach (String xn in used_ean_list)
                {
                    ean_in_use = xn;
 
                    XmlNodeList ean_node_list = xml.SelectNodes("/eanpool");
                    foreach (XmlNode ean_Node in ean_node_list)
                    {
                        ean = ean_Node["ean" + v].InnerText;
                        if (string.Equals(ean, ean_in_use))
                        {
                            return ean;
                        }
                        else
                        {
                            v++;
                        }
                    }
 
                }
            }
            catch (ArgumentNullException e)
            {
                MessageBox.Show("PROBLEM: " + e);
            }
            catch (Exception e)
            {
                MessageBox.Show("PROBLEM Exception: " + e);
            }
 
            Console.WriteLine("RETURN VALUE:" + ean);
            return ean;
        }
 
xmlriter...
 writer.WriteElementString("cr", ean());
<eanpool>
    <ean1>1111</ean1>
    <ean2>2222</ean2>
    <ean3>3333</ean3>
    <ean4>4444</ean4>
    <ean5>5555</ean5>
    <ean6>6666</ean6>
    <ean7>7777</ean7>
</eanpool>

ean1 wird in meine XML geschrieben aber beim nächsten speichern wird das 2. nicht mehr eingetragen. Also es bleibt bei ean1.
Und ich möchte das dann, wie du es gesagt hast, mit Enddatum pairen.
Aber ich habe das Gefühl, dass ich einfach zu "blöd" dafür bin :-)
Ich wäre dir so dankbar, wenn du mir in diesem Fall weiterhelfen könntest.

C# Dictionary<int, datetime> 4 Jahre 1 Monat her #3501

  • Jonny132
  • Jonny132s Avatar
  • OFFLINE
  • Administrator
  • Beiträge: 151
  • Dank erhalten: 3
  • Karma: 4
Hi,

so werden XML's nicht aufgebaut siehe wiki.selfhtml.org/wiki/XML/Regeln/Baumstruktur

Eine 'richtige' XML würde eher so aussehen:
<eanpool>
  <ean wert="1111" Datum="23.07.2015"></ean>
  <ean wert="4356" Datum="25.07.2015"></ean>
  <ean wert="1324" Datum="27.07.2015"></ean>
  <ean wert="1165" Datum="29.07.2015"></ean>
</eanpool>

Wenn du eine solche Struktur hast, kannst du einfach durch die Knoten und dessen Attribute iterieren.

C# Dictionary<int, datetime> 4 Jahre 1 Monat her #3523

  • xml-Aufbau
  • xml-Aufbaus Avatar
Hallo,

ich habe mal meine XML-Datei so aufgebaut, wie du es gesagt hast. Allerdings habe ich jetzt ein anderes Problem.
....
                    pwriter.WriteStartElement("eanpool");
 
                    pwriter.WriteStartElement("eans");
                    pwriter.WriteAttributeString("ean", "111");
                    pwriter.WriteAttributeString("datum", _st.label6.Text.ToString());
                    pwriter.WriteEndElement(); // Close EANs
 
                    pwriter.WriteStartElement("eans");
                    pwriter.WriteAttributeString("ean", "222");
                    pwriter.WriteAttributeString("datum", _st.label6.Text.ToString());
                    pwriter.WriteEndElement(); // Close EANs

_st.label.Text.ToString() ist das Label, wo mein Enddatum steht. Wie kann ich es jetzt so machen, dass nur 111 beschrieben wird und die restlichen nicht. Und wenn 111 beim nächsten mal belegt ist, dann erst auf die 222 usw usw...
Irgendwie komme ich nicht zu meinem Ziel :S

Wäre dankbar für alle Tipps...

C# Dictionary<int, datetime> 4 Jahre 1 Monat her #3524

  • Jonny132
  • Jonny132s Avatar
  • OFFLINE
  • Administrator
  • Beiträge: 151
  • Dank erhalten: 3
  • Karma: 4
Hi,

sorry ich versteh nicht was du meinst.
Ehrlich gesagt weiss ich nichtmal wo das Problem jetzt liegt.
XML schreiben? XML lesen? Prüfen ob ein Wert eingetragen werden darf?

Versuch doch mal eins nach dem anderen zu machen.
1. Schritt - Dictionary als XML im gewünschten Format speichern
2. Schritt - XML in ein Dictionary einlesen
3. Schritt - Überprüfen ob ein neuer Wert überhaupt eingetragen werden darf
Ladezeit der Seite: 0.263 Sekunden