[C#] linq + foreach = sporadische fouten in data

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 12-06 21:01
Hoi,

Ik heb een heel raar probleem, ik kan er niet bij hoe het kan:

Als ik mijn procedure de eerste keer draai, haalt hij alle data netjes op. Als ik dan de data wijzig, en ik wil de data een tweede keer ophalen, dan zijn sommige rijen, ineens heel anders van waarde!

Voorbeeld correcte data uit sql managementstudio:
id,vertex1,vertex2,count
1,129,111,8
2,61,61,32
....
38,500,6,256

Voorbeeld foutieve data in the quickwatch van Visual studio op _ECADB.edges:
id,vertex1,vertex2,count
1,113,54,9
2,74,112,114
....
38,1022,71,1

Ik kwam er achter, doordat waarde 1022 bij id 38 zo hoog was dat hij niets meer kon vinden met die waarde op regel 50.

Het gaat om code regel 42-50, daar blijken mijn edges ineens te veranderen.

C#:
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
        private void GetNodeXLControl()
        {
            try
            {
                SocialNetworkControls.Clear();

                // maak een nieuwe NodeXL control
                NodeXLControl ctx = new NodeXLControl();

                //Maak het grafiek object
                Graph mGraph = new Graph();

                // Haal alle vertices op uit de view vertices_plus,
                // die alleen vertices returned die aan edges zitten met een count groter dan 5
                var vertices = from vt in _ECADB.vertices_labels select vt;

                // Voor elke vertice, uit de vertice_plus view, dus een vertice_plus volgens LINQ2SQL
                foreach (vertices_label vt in vertices)
                {
                    Vertex v1 = new Vertex();

                    v1.SetValue(ReservedMetadataKeys.PerVertexLabel, vt.label);
                    v1.SetValue(ReservedMetadataKeys.VertexToolTip, vt.label);
                    v1.SetValue(ReservedMetadataKeys.Visibility, VisibilityKeyValue.Hidden);
                    v1.SetValue(ReservedMetadataKeys.PerVertexLabelFontSize, (Single)WpfGraphicsUtil.WindowsFormsFontSizeToWpfFontSize(5));
                    v1.SetValue(ReservedMetadataKeys.PerVertexLabelFillColor, Colors.Pink);
                    v1.Name = vt.vertex_id.ToString();
                    mGraph.Vertices.Add(v1);
                }

                // Lijn dikte varieert van 1 tot 20, waarbij dikte 20 het maximale aantal verbindingen tussen twee vertices voorstelt.
                //int maxwidth = (from ew in edges orderby ew.count descending select ew.count).First();

                // OF

                // Lijn dikte varieert van 1 tot 20, waarbij dikte 10 het gemiddelde voorstelt van de vertice count
                // en dubbele van het gemiddelde tot het maximale allemaal dikte 20 is.
                int maxwidth = (int)(from ew in _ECADB.vwAvgEdgeCounts select ew.avgmailcount).First();
                maxwidth = maxwidth == 0 ? 1 : maxwidth;

                // Haal alle edges op
                var edges = from edg in _ECADB.edges select edg;

                foreach (var ed in edges)
                {
                    IVertex v1;
                    IVertex v2;
                    var edx = ed;

                    mGraph.Vertices.Find(edx.vertex1_id.ToString(), out v1);
                    mGraph.Vertices.Find(edx.vertex2_id.ToString(), out v2);

                    v1.SetValue(ReservedMetadataKeys.Visibility, VisibilityKeyValue.Visible);
                    v2.SetValue(ReservedMetadataKeys.Visibility, VisibilityKeyValue.Visible);

                    Edge e1 = new Edge(v1, v2, true);
                    Single tempWidth = (edx.count ?? 1) / maxwidth * 10;
                    float mWidth = tempWidth < 1 ? 1 : tempWidth;
                    mWidth = mWidth > 20 ? 20 : mWidth;
                    e1.SetValue(ReservedMetadataKeys.PerEdgeWidth, mWidth);
                    e1.SetValue(ReservedMetadataKeys.PerAlpha, (Byte)55);
                    mGraph.Edges.Add(e1);
                }

                // Grafiek van de control ophalen
                ctx.Graph = mGraph;

                // Gebruik het Furchterman Reingold force-based algoritme;
                FruchtermanReingoldLayout lay = new FruchtermanReingoldLayout();
                // C is kracht constante van de simulatie. Hoger is meer afstoting tussen vertices
                lay.C = (Single)2;
                // Iterations is het aantal itteraties van de simulatie
                lay.Iterations = 10;

                // Attach layout aan de control
                ctx.Layout = lay;

                // Stel wat control opties in over de opmaak
                ctx.ShowVertexToolTips = true;
                ctx.GraphDrawer.VertexDrawer.Shape = VertexShape.Sphere;
                ctx.GraphDrawer.VertexDrawer.LabelPosition = VertexLabelPosition.TopCenter;

                // voeg control toe aan control collectie van form, tekent grafiek zonder layout automatisch
                SocialNetworkControls.Add(ctx);

                //Teken grafiek opnieuw maar nu met layout
                ctx.DrawGraphAsync(true);

            }
            catch (Exception ex)
            {

                MessageBox.Show("Error on NodeXL: " + ex.Message + "\n" + ex.InnerException);
            }
        }

update: het gaat fout met de datacontext, maar ik begrijp niet hoe. ik heb nu niet de globale datacontext gebruikt, maar een nieuwe gemaakt en dat werkt wel.

Acties:
  • 0 Henk 'm!

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 11-09 16:00

Skinny

DIRECT!

Heeft dit niet te maken met :

http://www.google.nl/sear...=access+to+modif&gs_rfai=
http://weblogs.asp.net/fb...dified-closure-demon.aspx

Oftewel, maak van

code:
1
2
3
4
5
6
foreach (vertices_label vt in vertices) 
                { 
                    Vertex v1 = new Vertex(); 

                    v1.SetValue(ReservedMetadataKeys.PerVertexLabel, vt.label); 
...


code:
1
2
3
4
5
6
7
foreach (vertices_label vt in vertices) 
                { 
                    var currentVertex = vt;
                    Vertex v1 = new Vertex(); 

                    v1.SetValue(ReservedMetadataKeys.PerVertexLabel, currentVertex.label); 
...

SIZE does matter.
"You're go at throttle up!"