Autor |
Beitrag |
Chocoemilio
Beiträge: 38
|
Verfasst: Mo 26.02.18 10:48
Hallo
Ich habe volgendes Problem, aus einen connectionString werden Daten gelesen, die dann in eine Dictionary hinzugefügt werden. Das Problem ist das der Key zwei mal vorkommen kann.
mit verschiedenen values, zur Zeit wird der Key nur ein mal gelessen, deswegen fehlen Daten.
Die jetzige Abfrage:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| static Dictionary<String, Tuple<String, String>> articleInfo = new Dictionary<String, Tuple<String, String>>();
if (!wdpGroup.ContainsKey(group)) { wdpGroup.Add(group, new Tuple<string, decimal>(article, amount)); } |
Ich habe mir gedacht das ich anstatt die Tuple eine andere Dictonary einsetze aber ich bekomme nur eine Fehlermeldung
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| static Dictionary<String, Dictionary<String, decimal>> wdpGroup = new Dictionary<String, Dictionary<String, decimal>>(); public Dictionary<String, Dictionary<String, decimal>> getGroupMappping() { String connectionString = "Data Source=mention.wdp.intern; Initial Catalog=mention_wdp; Persist Security Info=True;User ID=********;Password=********"; using (SqlConnection con = new SqlConnection(connectionString)) { con.Open(); String sql = @"SELECT AEL.ARANUMMER as [group], (SELECT TOP 1 XUMB.ARANUMMER FROM AEL AS XUMB WITH(NOLOCK) WHERE XUMB.ARIDNR = AEL.ARUMBIDNR) as group_article, AELX.ARANUMMER as article, CAST(AEL2.AGMENGE AS NUMERIC(8, 0)) as amount FROM AEL LEFT JOIN AEL2 WITH(NOLOCK)ON ael2.agaidnr = ael.aridnr LEFT JOIN AEL AS AELx WITH(NOLOCK) ON AELx.aridnr = ael2.agidnr WHERE AEL.ARMANKEY = 1000 AND ael.artyp = 'A' AND ael.argruppe IN('G', 'Z') ORDER BY[group]"; SqlCommand cmd = new SqlCommand(sql, con); cmd.CommandTimeout = 300; SqlDataReader reader = cmd.ExecuteReader(); if (reader != null) { int count = 0; while (reader.Read()) { String group = reader.GetString(0).Trim(); String article = reader.GetString(2).Trim(); decimal amount = reader.GetDecimal(3);
if (!wdpGroup.ContainsKey(group)) { wdpGroup.Add(group, new Dictionary<string, decimal>(article, amount)); } } } return wdpGroup; } |
Wäre sehr dankbar über Vorschläge ???
Moderiert von Christian S.: Username und Passwort im Connection-String durch Sternchen ersetzt
Moderiert von Christian S.: C#-Tags hinzugefügt
Moderiert von Christian S.: Rechtschreibfehler im Titel geändertModeriert von Th69: Topic aus C# - Die Sprache verschoben am Mo 26.02.2018 um 12:09
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 26.02.18 12:29
Hallo und
es gibt keinen Dictionary-Konstruktor, der gleich 1 Wert hinzufügt. Dies mußt du separat vorher machen:
C#-Quelltext 1: 2: 3: 4:
| var dict = new Dictionary<string, decimal>(); dict.Add(article, amount);
wdpGroup.Add(group, dict); |
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 26.02.18 15:04
Sowas hier geht:
C#-Quelltext 1:
| new Dictionary<string, decimal>() {{article, amount}} |
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Chocoemilio
Beiträge: 38
|
Verfasst: Di 27.02.18 09:15
Cool danke ich habe das jetzt so gelöst:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Dictionary<string, decimal> articlesDict;
if (!wdpGroup.ContainsKey(group)) { articlesDict = new Dictionary<string, decimal>(); wdpGroup.Add(group, articlesDict); } else { articlesDict = wdpGroup[group]; } articlesDict.Add(article, amount); |
Moderiert von Christian S.: Beiträge zusammengefasst
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| public string item1 { get; set; } public string item2 { get; set; } public string item3 { get; set; } public Int32 item4 { get; set; }
public DiractoryConvert_to_List(Dictionary<string, decimal> value1, Dictionary<string, decimal> value2, string key, Dictionary<string, decimal> value3) { this.item2 = value1.ToString(); this.item1 = value2.ToString(); this.item3 = key; this.item4 = value3; }
List<DiractoryConvert_to_List> artikelNummer1 = new List<DiractoryConvert_to_List>(); artikelNummer1 = (from t in wdpGroup.ToList() select new DiractoryConvert_to_List ( t.Key, t.Value )).ToList(); |
Ein Problem habe ich noch wie kann ich auf die Daten zugreifen, so wie ich das habe funktioniert es nicht ???
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 27.02.18 10:30
Mir scheint es, als ob du dich mit den ganzen Dictionary<> ein wenig verzettelt hast (dein unterer Code ergibt irgendwie überhaupt keinen Sinn)!?
|
|
Chocoemilio
Beiträge: 38
|
Verfasst: Mi 28.02.18 09:24
Hi danke für die Antwort.
Das Problem war das das value ein Index hatte also z.b [0]: {[(key)300023,(value)2]}, der value kann halt bis zu zwei Index haben.
Ich konnte halt nicht darauf auf die einzelnen werte zugreifen. Ich habe das jetzt so gelöst aber ich suche noch eine bessere variante ???
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74:
| class DiractoryConvert_to_List { public string item1 { get; set; } public string item2 { get; set; } public string item3 { get; set; } public Int32 item4 { get; set; } public string item5 { get; set; } public Int32 item6 { get; set; }
public DiractoryConvert_to_List(List<DiractoryConvert_to_List> artikelNummer, string key, Dictionary<string, decimal> value) { this.item1 = '8' + key.ToString().Substring(1); foreach (var i in value) { string element = i.ToString();
string w = element.Split('[')[1]; string a = "";
foreach (char chr in w) { if(Convert.ToInt32(chr) >= 48 && Convert.ToInt32(chr) <= 57) { a += chr; } else { break; } }
string e = element.Split(',')[1]; string x = "";
foreach (char chr in e.Trim()) { if (Convert.ToInt32(chr) >= 48 && Convert.ToInt32(chr) <= 57) { x += chr; } else { break; } }
string b_artikel = '8' + a.ToString().Substring(1) + " "; this.item2 += b_artikel; this.item3 += x + " ";
foreach(DiractoryConvert_to_List p in artikelNummer) { if(p.item2.Equals(b_artikel.Trim())) { if (p.item1 != null) { this.item5 += p.item1 + " "; } else { item6++; } } } } } } |
|
|
|