Springen naar inhoud


- - - - -
VS 2015

Aantal Van Zelfde Soort Tonen?

VS2015

  • Log in a.u.b. om te beantwoorden
Er zijn 9 reacties in dit onderwerp

#1 pascalbianca

pascalbianca

    Webmaster/Admin

  • Webmaster
  • 4382 berichten
    Laatst bezocht 26 nov 2018 06:49
  • LocatieSusteren, Nederland, Midden Limburg.
Inzender

Geplaatst op 15 juni 2018 - 07:05

Bijlage  lijst.png   4,65K   3 downloads

In bovenstaande lijst zitten diverse zelfde nummer.
Nu zou ik graag in message boxen willen zien hoeveel van elk nummer hetzelfde erin heb zitten.
Is dit mogelijk? zo ja hoe want zelf heb ik totaal geen idee hoe dit zou moeten.

Ik doe dus ook in mijn code een combobox vullen en haal daar de dubbele items in weg, moet dat in zo een tren dan in een array gestopt worden of zo?
Visual Basic Code:
  Dim i1, j1 As Int32
			For i1 = 0 To Me.ComboBox1.Items.Count - 2 Step 1
				For j1 = Me.ComboBox1.Items.Count - 1 To i1 + 1 Step -1
					If Me.ComboBox1.Items(i1).ToString = Me.ComboBox1.Items(j1).ToString Then
						Me.ComboBox1.Items.RemoveAt(j1)

					End If
				Next
			Next


#2 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1092 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 15 juni 2018 - 08:30

Bericht bekijkenpascalbianca, op 15 juni 2018 - 07:05, zei:

Bijlage lijst.png

In bovenstaande lijst zitten diverse zelfde nummer.

Lijst van wat eigenlijk?


Bericht bekijkenpascalbianca, op 15 juni 2018 - 07:05, zei:

Nu zou ik graag in message boxen willen zien hoeveel van elk nummer hetzelfde erin heb zitten.
Is dit mogelijk? zo ja hoe want zelf heb ik totaal geen idee hoe dit zou moeten.

Ja. Piece-of-cake met Linq, daarvoor hebben ze het gemaakt.
Ik zou het voor je kunnen uitschrijven, als ik zou weten wat er in je lijst zit.
Je gebruikt de standard query operator Count:

Ofwel met de query syntax: Aggregate ... In ... Into Count
Ofwel met de method syntax: IEnumerable<T>.Count()

#3 pascalbianca

pascalbianca

    Webmaster/Admin

  • Webmaster
  • 4382 berichten
    Laatst bezocht 26 nov 2018 06:49
  • LocatieSusteren, Nederland, Midden Limburg.
Inzender

Geplaatst op 15 juni 2018 - 10:26

Dit is een storings lijst.
De eerste kolom is de datum, 2 de kolom tijd, dan nummer dan status en als laatste melding tekst.
Ik zit op mijn werk nu en probeer tussendoor nog wat uit maar loop steeds spaak ergens.

De uiteindelijke bedoeling van mijn kant uit is, dat ik al die storingen in een grafiek kan zien en dat ik bv zoals in de tekening zie hoe vaak in de lijst storingsnummer 6800 in de lijst tegen kom.
Dat we een overzicht hebben hoe vaak een storing voorkomt.

#4 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1092 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 15 juni 2018 - 10:44

Bericht bekijkenpascalbianca, op 15 juni 2018 - 10:26, zei:

Dit is een storings lijst.
De eerste kolom is de datum, 2 de kolom tijd, dan nummer dan status en als laatste melding tekst.
Wat is het datatype van de elementen in die storingslijst?
Zijn dat objecten?

En wat is het type van de lijst?

#5 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1092 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 15 juni 2018 - 11:29

Indien het een lijst van objecten betreft (ik maak hier mijn eigen klasse, omdat ik die van jou niet heb) :

Visual Basic Code:
Public Class Storing
'De eerste kolom is de datum, 2 de kolom tijd, dan nummer dan status en als laatste melding tekst.
' DateTime is Date + Time
Public Property DatumUur As DateTime
Public Property Nummer As String
Public Property Status As Status
Public Property Melding As string
End Class

Public Enum Status
Ok
Probleem
Dringend
Ramp
End Enum


Dan is dit voldoende om te groeperen en te tellen:

Visual Basic Code:
	 ' Groeperen en tellen
	  Dim geteld = storingsLijst.
			GroupBy(Function(s) s.Nummer).
			 Select(Function(g) New With {.Nummer = g.Key, g.Count}).
			 ToList


Mijn volledige testcode:

Visual Basic Code:
		 Dim sb As New StringBuilder
	 ' de storingslijst in een string stoppen, om te tonen
	 storingsLijst.ForEach(
		 Sub(s) sb.AppendLine($"{s.Nummer} | {s.DatumUur:dd/MM/yyyy} | {s.DatumUur:HH:mm:ss} | {s.Melding}| {s.Status}"))
	 ' Groeperen en tellen
	 Dim geteld = storingsLijst.
				 GroupBy(Function(s) s.Nummer).
				 Select(Function(g) New With {.Nummer = g.Key, g.Count}).
				 ToList
	 ' de getelde in een string stoppen om straks te tonen
	 geteld.ForEach(Sub(g) sb.AppendLine($"{g.Nummer} heeft {g.Count} meldingen"))
	 ' tonen
	 MessageBox.Show(sb.ToString)



Geeft:
Bijlage  groeperenentellen.png   30,32K   4 downloads

#6 pascalbianca

pascalbianca

    Webmaster/Admin

  • Webmaster
  • 4382 berichten
    Laatst bezocht 26 nov 2018 06:49
  • LocatieSusteren, Nederland, Midden Limburg.
Inzender

Geplaatst op 15 juni 2018 - 12:12

Het programma is als volgt gemaakt.
Ik heb een datagridview die leeg is, zonder kolommen.
Via een openfile dialog kies ik mijn CSV bestand.
In mijn  code word het csv bestand gesplit en in een dataset gestopt waarna deze aan de datagridview gekoppeld word (zie foto van mijn voorbeeld)
Eenmaal in mijn datagridview gelezen worden de kolommen hernoemd (indeling reeds door jou ook gebruikt).
Hier word ook een combobox mee gevuld maar alle dubbele waarden worden eruit gefilterd, als een filter word deze gebruikt als ik dus op een bepaalde nummer wil zoeken.
Alles staat in die datagridview gewoon als tekst.

PS.:
Ik heb je code eens geprobeerd om te snappen wat er gedaan word maar krijg deze melding.:
Severity Code Description Project File Line Suppression State
Error BC30451 'storingsLijst' is not declared. It may be inaccessible due to its protection level. HMI Reader c:\HMI Project\HMI Reader\HMI Reader\Form1.vb 322 Active

#7 pascalbianca

pascalbianca

    Webmaster/Admin

  • Webmaster
  • 4382 berichten
    Laatst bezocht 26 nov 2018 06:49
  • LocatieSusteren, Nederland, Midden Limburg.
Inzender

Geplaatst op 15 juni 2018 - 13:21

Update.

Ik heb deze code nu en laat ook het aantal keren zien wat iets dubbel komt.
Niet echt netjes de code ook de uitvoer niet maar hij doet ongeveer wat ik wil, moet alleen kijken hoe ik met die gegevens een grafiek kan maken.

Visual Basic Code:
  Dim dic As Dictionary(Of String, Integer) = New Dictionary(Of String, Integer)()
		Dim cellValue As String = Nothing

		For i As Integer = 0 To DataGridView1.Rows.Count - 1

			If Not DataGridView1.Rows(i).IsNewRow Then
				cellValue = DataGridView1(2, i).Value.ToString()

				If Not dic.ContainsKey(cellValue) Then
					dic.Add(cellValue, 1)
				Else
					dic(cellValue) += 1
				End If
			End If
		Next

		Dim sb As StringBuilder = New StringBuilder()
		sb.AppendLine("Number of unique products:")

		For Each keyvalue As KeyValuePair(Of String, Integer) In dic
			sb.AppendLine(String.Format("{0}: {1}", keyvalue.Key, keyvalue.Value))
			ListBox1.Items.Add(keyvalue.ToString())
		Next



#8 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1092 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 15 juni 2018 - 18:43

Bericht bekijkenpascalbianca, op 15 juni 2018 - 13:21, zei:

Ik heb deze code nu en laat ook het aantal keren zien wat iets dubbel komt.
Niet echt netjes de code
Niets mis met die code toch?

In Linq gaat dat, in de veronderstelling dat Cells(2) een string is, en dat je het in een dictionary wil als volgt:
Visual Basic Code:

Dim geteld = DataGridView1.Rows.
	 Cast(Of DataGridViewRow).
	 Where(Function(row) Not row.IsNewRow).
	 GroupBy(Function(row) row.Cells(2).Value.ToString).
	 ToDictionary(Function(g) g.Key, Function(g) g.Count)


Maar waarom werk je niet gewoon op de achterliggende datatable?

#9 pascalbianca

pascalbianca

    Webmaster/Admin

  • Webmaster
  • 4382 berichten
    Laatst bezocht 26 nov 2018 06:49
  • LocatieSusteren, Nederland, Midden Limburg.
Inzender

Geplaatst op 16 juni 2018 - 11:54

Bericht bekijkenDirk Andries, op 15 juni 2018 - 18:43, zei:

Maar waarom werk je niet gewoon op de achterliggende datatable?

Hoe dat dan?

#10 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1092 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 16 juni 2018 - 14:49

Bericht bekijkenpascalbianca, op 16 juni 2018 - 11:54, zei:

Hoe dat dan?

Wel, volgens deze uitleg heb je ook een datatable (in een dataset) als leverancier van de data in je grid:

Bericht bekijkenpascalbianca, op 15 juni 2018 - 12:12, zei:

Ik heb een datagridview die leeg is, zonder kolommen.
Via een openfile dialog kies ik mijn CSV bestand.
In mijn  code word het csv bestand gesplit en in een dataset gestopt waarna deze aan de datagridview gekoppeld word (zie foto van mijn voorbeeld)
Je kan dus ook volgens mij net zo goed rechtstreeks op die datatable werken.
En dat kan dus ook weer met Linq.
Zie deze post voor een voorbeeld met een GroupBy op een datatable (hier niet Count, maar Min en Max).





Ook met taq VS 2015, VS2015 voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[VS 2015] Untitled 1

Met dank aan J├╝rgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)