Springen naar inhoud


- - - - -
C# 2015

Gemiddelde Berekenen



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

#1 Scheepers

Scheepers

    Senior Developer

  • Leden
  • PipPipPip
  • 227 berichten
    Laatst bezocht 09 mei 2019 08:37

Geplaatst op 23 januari 2019 - 11:15

Ik ben bezig met mijn eerste project in C sharp in VS 2017.
De opdracht is een CSV bestand uit te lezen en per 'Identifier2' en daarna 'Identifier1' een gemiddelde te maken van 'd 13C/12C'.

Het CSV bestand uit lezen en deze in een classe te zetten is geen probleem, maar het gemiddelde van d13C/12C a.d.h. identifier2 en identifier1 kom ik niet uit.
Toegevoegd een voorbeeld

Wie kan mij helpen?

#2 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1164 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 24 januari 2019 - 09:17

Bericht bekijkenScheepers, op 23 januari 2019 - 11:15, zei:

maar het gemiddelde van d13C/12C a.d.h. identifier2 en identifier1 kom ik niet uit.
En met welk stuk heb je een probleem?

Bericht bekijkenScheepers, op 23 januari 2019 - 11:15, zei:

Toegevoegd een voorbeeld
Waar?

#3 Scheepers

Scheepers

    Senior Developer

  • Leden
  • PipPipPip
  • 227 berichten
    Laatst bezocht 09 mei 2019 08:37

Geplaatst op 24 januari 2019 - 09:50

De bijlage is niet toegevoegd lijkt, ondanks dat ik deze onderaan heb toegevoegd. Ook plakken van een tekst gaat niet
Dit is het voorbeeld:
Identifier 1, Identifier 2, Rt,Ampl. 44,d 13C/12C
T=0,22000000,198.1,16847,-27.288
T=0,22000000,247.7,16443,-27293
T=0,22000000,198.1,17517,-27357
T=30,22000002,247.7,17859,-27361
T=30,22000002,247.7,15853,-27.246
T=30,22000002,248.7,17859,-27.361
T=0,201001001,198.1,17634,-28.03
T=0,201001001,198.1,16847,-27.29
T=0,201001001,247.7,17347,-28.022
T=30,201001002,198.1,17634,-28.03
T=30,201001002,198.1,16847,-27.288
T=30,201001002,2477,1747,-2.102

De uitkomst moet zijn:
Identifier 1,Identifer 2, Gemiddelde
T=0,220000001,-27.312667
T=30,220000002,-27.3227
T=0,201001001,-27.78
T=30,201001002,-27.78

3 rijen daarvan moet een gemiddelde komen.

Ik heb het voorbeeld tijdelijk in Access gezet en een query gemaakt, maar nu moet de query in C sharp gezet worden a.d.h. de classe.
Dit is de query
SELECT Tabel1.[Identifier 1], Tabel1.[Identifier 2],AVG(Tabel1.[13C/12C]) AS [Gemiddelde_13C/12C]
FROM Tabel1
GROUP BY Tabel1.[Identifier1], Tabel1.[Identifier 2]
HAVING (((Tabel1.[Identifier 1])='T0' OR (Tabel1.[Identifier 1])='T=30'))
ORDER BY Tabel1.[Identifier 1];

#4 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1164 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 24 januari 2019 - 11:36

Bericht bekijkenScheepers, op 24 januari 2019 - 09:50, zei:

Dit is het voorbeeld:
Dat lijkt niet volledig correct ingetikt, maar hebt het wat aangepast om het min of meer werkend te krijgen.

Bericht bekijkenScheepers, op 24 januari 2019 - 09:50, zei:

De uitkomst moet zijn:
Identifier 1,Identifer 2, Gemiddelde
T=0,220000001,-27.312667
T=30,220000002,-27.3227
T=0,201001001,-27.78
T=30,201001002,-27.78
Ik heb iets andere uitkomsten (de laatste), maar dat is te wijten aan de  fouten in het voorbeeld.
Ik werk ook met double (jij met single?).

Bericht bekijkenScheepers, op 24 januari 2019 - 09:50, zei:

3 rijen daarvan moet een gemiddelde komen.
Ik heb gewoon gegroepeerd, omdat ik niet weet of het altijd 3 is (of zal blijven)

Bericht bekijkenScheepers, op 24 januari 2019 - 09:50, zei:

Ik heb het voorbeeld tijdelijk in Access gezet en een query gemaakt, maar nu moet de query in C sharp gezet worden a.d.h. de classe.
Dit heb je pas toegevoegd toen ik al gedaan had.


Gegeven de klasse Entry:
C Code:
	public class Entry
	{
		public Entry(int identifier1, int identifier2, double delta)
		{
			Identifier1 = identifier1;
			Identifier2 = identifier2;
			Delta = delta;
		}

		public int Identifier1 { get; set; }
		public int Identifier2 { get; set; }
		public double Delta { get; set; }

		public override string ToString()
		{
			return $"T={Identifier1},{Identifier2},{Delta:F6}";
		}
	}


geeft dit programma:
C Code:
public static class Program
	{
		public static void Main(string[] args)
		{
			string[] lines =
			{
				"T = 0,22000000,198.1,16847,-27.288",
				"T = 0,22000000,247.7,16443,-27.293",
				"T = 0,22000000,198.1,17517,-27.357",
				"T = 30,22000002,247.7,17859,-27.361",
				"T = 30,22000002,247.7,15853,-27.246",
				"T = 30,22000002,248.7,17859,-27.361",
				"T = 0,201001001,198.1,17634,-28.03",
				"T = 0,201001001,198.1,16847,-27.29",
				"T = 0,201001001,247.7,17347,-28.022",
				"T = 30,201001002,198.1,17634,-28.03",
				"T = 30,201001002,198.1,16847,-27.288",
				"T = 30,201001002,2477,1747,-27.102"
			};

			var entries = GetEntries(lines).ToList();
			entries.ForEach(e => Console.WriteLine($"{e}"));
			Console.ReadLine();
		}

		private static IEnumerable<Entry> GetEntries(IEnumerable<string> lines)
		{
			return lines
				.Select(EntryFromString)
				.GroupBy(e => new { e.Identifier1, e.Identifier2 }, e => e.Delta)
				.Select(g => new Entry(g.Key.Identifier1, g.Key.Identifier2, g.Average()));
		}

		private static Entry EntryFromString(string s)
		{
			var arr = s.Substring(4).Split(',');
			return new Entry(
					int.Parse(arr[0]),
					int.Parse(arr[1]),
					double.Parse(arr[4], CultureInfo.InvariantCulture));
		}
	}


Deze uitvoer:
T=0,22000000,-27,312667
T=30,22000002,-27,322667
T=0,201001001,-27,780667
T=30,201001002,-27,473333



De truuk zit:
1. In de GroupBy die de lijst zal groeperen op Identifier1, Identifier2
2. Het gemiddelde laten berekenen van elke groep met Average();
Zie ook bijlage voor project

Bijgevoegde Bestanden



#5 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1164 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 24 januari 2019 - 11:47

Bericht bekijkenDirk Andries, op 24 januari 2019 - 11:36, zei:

Deze uitvoer:
T=0,22000000,-27,312667
T=30,22000002,-27,322667
T=0,201001001,-27,780667
T=30,201001002,-27,473333



Als je de .ToString met punt voor decimalen wil dan in klasse Entry:

C Code:
		public override string ToString()
		{
			return $"T={Identifier1},{Identifier2},{Delta.ToString("F6", CultureInfo.InvariantCulture)}";
		}



#6 Scheepers

Scheepers

    Senior Developer

  • Leden
  • PipPipPip
  • 227 berichten
    Laatst bezocht 09 mei 2019 08:37

Geplaatst op 24 januari 2019 - 13:34

Het werkt.
Dank je we voor de snelle hulp

#7 Scheepers

Scheepers

    Senior Developer

  • Leden
  • PipPipPip
  • 227 berichten
    Laatst bezocht 09 mei 2019 08:37

Geplaatst op 11 februari 2019 - 12:03

Er is nog een vervolg vraag gesteld en daar heb ik hulp bij nodig.
De datagridview wordt gevuld vanuit het CSV bestand en 'Identifier2' kan meerdere rows hebben (meestal 3) met een uitslag in 'D13C_12C'.
Nu wil de gebruiker als de waarde van de 3 uitslagen onderling 0.5 verschillen de afwijkende uitslag rood gekleurd hebben.

#8 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1164 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 12 februari 2019 - 21:27

Bericht bekijkenScheepers, op 11 februari 2019 - 12:03, zei:

Er is nog een vervolg vraag gesteld en daar heb ik hulp bij nodig.
De datagridview wordt gevuld vanuit het CSV bestand en 'Identifier2' kan meerdere rows hebben (meestal 3) met een uitslag in 'D13C_12C'.
Nu wil de gebruiker als de waarde van de 3 uitslagen onderling 0.5 verschillen de afwijkende uitslag rood gekleurd hebben.

Wat heb je al en wat exact lukt je niet?

#9 Scheepers

Scheepers

    Senior Developer

  • Leden
  • PipPipPip
  • 227 berichten
    Laatst bezocht 09 mei 2019 08:37

Geplaatst op 13 februari 2019 - 11:51

Hieronder een stukje code uit het programma waarmee de datagridview gevuld wordt. Daaronder wil ik de routine van mijn vraag en ik weet niet hoe ik dit moet doen.

  var records = new List<Foo>();

                    csv.Read();

                while (csv.Read())
                {
                     words = csv.GetField(0).Split(',');
                   var record = new Foo
                    {
                    Identifier1 = words[0],
                       Identifier2 = words[1],
                       Rt = words[2],
                       Ampl44 = words[3],
                       d13C_12C = words[4],
                   };
                    if (!string.IsNullOrEmpty(words[1]))
                    {
                  records.Add(record);
                     }
                }

                var bindingList = new BindingList<Foo>(records);
                var source = new BindingSource(bindingList, null);
                dgCSV.DataSource = source;

                //dgCSV.DataSource = records;
                dgCSV.Columns[2].Visible = false;
                dgCSV.Columns[5].Visible = false;

//rood kleuren column[3] >15.000
                GetCellWhereTextExistsInGridView(dgCSV, 3);

//verschil van <0.5 rood kleuren in dgCSV.Columns[4]

#10 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1164 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 23 februari 2019 - 14:20

Bericht bekijkenScheepers, op 13 februari 2019 - 11:51, zei:

Hieronder een stukje code uit het programma waarmee de datagridview gevuld wordt. Daaronder wil ik de routine van mijn vraag en ik weet niet hoe ik dit moet doen.
Je wil dat toch niet achteraf doen?

Sla dat gewoon op in je Foo klasse (of structure).
Bijvoorbeeld property WijktAf As Boolean. Gebruik daarvoor de Select na de GroupBy (uit vorige code) en kijk binnenin de group (met de Any() Linq operator) of er minstens 1 afwijkt met meer dan je delta waarde.
Als er 1 van de group afwijkt dan is WijktAf voor allemaal True.

Bij het tekenen van je kolom in de grid kijkt je voor de kleur gewoon naar WijktAf: indien True an moet er gekleurd worden.





Ook met taq C# 2015 voorzien

0 gebruiker(s) lezen dit onderwerp

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

Inloggen


[C# 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)