Benutzer mit den meisten Antworten
Ideen-Konzepte-Überwachung ID

Frage
-
Hallo,
ich suche gute Ansätze für folgende Aufgabe.
Eine ID darf innerhalb von 7 Tagen nur 1 mal vorkommen.
ID -- WERT -- Datum
1 -- 444440000001 -- 23.08.2011
2 -- 444440000002 -- 23.08.2011
1112 -- 444440011112 -- 24.08.2011
....
Pro Tag werden ca. 5000 ID's angelegt.
Reicht da ein Dataset, speichern in XML
Query über LinQ?
ToDo
Erhalt der ID
Überpüfung vorhanden <= 7 Tage ?
JA - STOPP -> Fehler
NEIN - IO- Weiter
Grüße Andreas
Antworten
-
Hallo Andreas,
ich würde jeden Tag in einer Tagedatei halten.
vielleicht die Grund - Klassen folgendermassen (ich serialisiere mal JSON, Du kannst aber auch den SoapFormatter, BinaryFormatter nehmen, wenn es noch kompakter werden soll. JSON kann man aber für den Anfang noch gut "lesen".)
using System; using System.Collections.Generic; using System.IO; using System.Runtime.Serialization.Json; //System.Runtime.Serialization.dll using System.Text; using System.Windows.Forms; namespace WinExcelDemo { public partial class Form1 : Form { List<ID> ids = new List<ID>(); string tagesDatei; public Form1() { InitializeComponent(); tagesDatei = DateTime.Now.ToString("yyyy-MM-dd") + " IDs.txt"; } private void Form1_Load(object sender, EventArgs e) { ids.Add(new ID { IDKey = 1, Wert = 444440000001, Datum = new DateTime(2011, 08, 23) }); ids.Add(new ID { IDKey = 2, Wert = 444440000002, Datum = new DateTime(2011, 08, 23) }); ids.Add(new ID { IDKey = 1, Wert = 444440011112, Datum = new DateTime(2011, 08, 24) }); File.WriteAllText(tagesDatei, JSONUtil.Serialisieren(ids)); ids = null; ids = JSONUtil.Deserialisieren<List<ID>>(File.ReadAllText(tagesDatei)); } } public class JSONUtil { public static string Serialisieren<T>(T objekt) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(objekt.GetType()); MemoryStream ms = new MemoryStream(); serializer.WriteObject(ms, objekt); string rückgabeWert = Encoding.Default.GetString(ms.ToArray()); ms.Dispose(); return rückgabeWert; } public static T Deserialisieren<T>(string json) { T objekt = Activator.CreateInstance<T>(); MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)); DataContractJsonSerializer serializer = new DataContractJsonSerializer(objekt.GetType()); objekt = (T)serializer.ReadObject(ms); ms.Close(); ms.Dispose(); return objekt; } } public class ID { public int IDKey { get; set; } public long Wert { get; set; } public DateTime Datum { get; set; } } }
Dann eben die entsprechenden 7 Tageslisten laden und z.B. mit Contains / Where und Linq vergleichen.
Performanter kann das gehen, wenn man sich die Anzahl der letzten 6 Tage pro ID mit in die Datei sichert, Dann braucht man nur noch den aktuellen Tag und den Tag davor vergleichen.
ciao Frank- Als Antwort markiert Andreas Bauer2 Donnerstag, 25. August 2011 18:38
Alle Antworten
-
Hallo Andreas,
ich würde jeden Tag in einer Tagedatei halten.
vielleicht die Grund - Klassen folgendermassen (ich serialisiere mal JSON, Du kannst aber auch den SoapFormatter, BinaryFormatter nehmen, wenn es noch kompakter werden soll. JSON kann man aber für den Anfang noch gut "lesen".)
using System; using System.Collections.Generic; using System.IO; using System.Runtime.Serialization.Json; //System.Runtime.Serialization.dll using System.Text; using System.Windows.Forms; namespace WinExcelDemo { public partial class Form1 : Form { List<ID> ids = new List<ID>(); string tagesDatei; public Form1() { InitializeComponent(); tagesDatei = DateTime.Now.ToString("yyyy-MM-dd") + " IDs.txt"; } private void Form1_Load(object sender, EventArgs e) { ids.Add(new ID { IDKey = 1, Wert = 444440000001, Datum = new DateTime(2011, 08, 23) }); ids.Add(new ID { IDKey = 2, Wert = 444440000002, Datum = new DateTime(2011, 08, 23) }); ids.Add(new ID { IDKey = 1, Wert = 444440011112, Datum = new DateTime(2011, 08, 24) }); File.WriteAllText(tagesDatei, JSONUtil.Serialisieren(ids)); ids = null; ids = JSONUtil.Deserialisieren<List<ID>>(File.ReadAllText(tagesDatei)); } } public class JSONUtil { public static string Serialisieren<T>(T objekt) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(objekt.GetType()); MemoryStream ms = new MemoryStream(); serializer.WriteObject(ms, objekt); string rückgabeWert = Encoding.Default.GetString(ms.ToArray()); ms.Dispose(); return rückgabeWert; } public static T Deserialisieren<T>(string json) { T objekt = Activator.CreateInstance<T>(); MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)); DataContractJsonSerializer serializer = new DataContractJsonSerializer(objekt.GetType()); objekt = (T)serializer.ReadObject(ms); ms.Close(); ms.Dispose(); return objekt; } } public class ID { public int IDKey { get; set; } public long Wert { get; set; } public DateTime Datum { get; set; } } }
Dann eben die entsprechenden 7 Tageslisten laden und z.B. mit Contains / Where und Linq vergleichen.
Performanter kann das gehen, wenn man sich die Anzahl der letzten 6 Tage pro ID mit in die Datei sichert, Dann braucht man nur noch den aktuellen Tag und den Tag davor vergleichen.
ciao Frank- Als Antwort markiert Andreas Bauer2 Donnerstag, 25. August 2011 18:38
-
Hallo Frank, ich hab's so gelöst.
Problem
Wenn die Datei nochnicht existiert lege ich 2 mal eine neue Liste an.
Geht das anders?
List<PanelID> ids = new List<PanelID>();
Wie würde ich mit LinQ jetzt mehrere Tage am besten abfragen?
Danke.
Grüße Andreas
public partial class frmTest : Form { public frmTest() { InitializeComponent(); } private void btnTest_Click(object sender, EventArgs e) { string ret = txtID.Text; // ** Prüfen, schon mal ? List<PanelID> ids = new List<PanelID>(); string folderdayFile, dayFile; folderdayFile = Application.StartupPath + @"\..\..\Log\PanelIDs\"; dayFile = folderdayFile + DateTime.Now.ToString("yyyy-MM-dd") + "-Panel-IDs.txt"; ids = null; if (File.Exists(dayFile)) ids = PanelSerializer.Deserialisieren<List<PanelID>>(File.ReadAllText(dayFile)); if (ids != null) { var qryPanelCode = (from c in ids where c.Wert == ret select c).ToList(); if (qryPanelCode.Count == 0) { ids.Add(new PanelID { IDKey = ids.Count + 1, Wert = ret, Datum = DateTime.Now }); File.WriteAllText(dayFile, PanelSerializer.Serialisieren(ids)); } else { txtID.Text = "Already"; } } else { ids = new List<PanelID>(); ids.Add(new PanelID { IDKey = ids.Count +1, Wert = ret, Datum = DateTime.Now }); File.WriteAllText(dayFile, PanelSerializer.Serialisieren(ids)); } } } -------- public class PanelSerializer { public static string Serialisieren<T>(T objekt) { XmlSerializer serializer = new XmlSerializer(objekt.GetType()); MemoryStream ms = new MemoryStream(); serializer.Serialize(ms, objekt); string rückgabeWert = Encoding.Default.GetString(ms.ToArray()); ms.Dispose(); return rückgabeWert; } public static T Deserialisieren<T>(string json) { T objekt = Activator.CreateInstance<T>(); MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)); XmlSerializer serializer = new XmlSerializer(objekt.GetType()); objekt = (T)serializer.Deserialize(ms); ms.Close(); ms.Dispose(); return objekt; } } public class PanelID { public int IDKey { get; set; } public string Wert { get; set; } public DateTime Datum { get; set; } }