Fördela pengar utifrån en lista i C#?

Permalänk

Fördela pengar utifrån en lista i C#?

Hej! Jag har fastnat lite på en uppgift där jag skapar en lista med x antal personer och sedan fyller i x summa pengar som ska fördelas mellan personerna i min lista. Jag behöver göra en metod som ska sköta detta. Hur gör man smidigast för att fördela int pengar till vardera person i min string list?

Permalänk
Medlem
Skrivet av Elliedoso:

Hej! Jag har fastnat lite på en uppgift där jag skapar en lista med x antal personer och sedan fyller i x summa pengar som ska fördelas mellan personerna i min lista. Jag behöver göra en metod som ska sköta detta. Hur gör man smidigast för att fördela int pengar till vardera person i min string list?

Om alla ska få lika mycket pengar handlar det väl(?) bara om att du ska dela summan av pengar på antalet personer i listan?

Visa signatur

:(){ :|:& };:

🏊🏻‍♂️   🚴🏻‍♂️   🏃🏻‍♂️   ☕

Permalänk
Medlem

Kan du visa lite kod innan?
Det verkar riktigt lätt.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Skrivet av freddyfresh:

Kan du visa lite kod innan?
Det verkar riktigt lätt.

public class DistributeMoney
{
List<Person> People { get; set; } = new List<Person>();

public void moneyToDistribute(int money) // min metod som ska fördela pengarna
{
for (int i = 0; i <= money; i++)
foreach (Person person in People)
{
person.Money++;
}
}
}

Så ser min klass och metod ut. Sedan lägger jag till x antal personer i en lista med en knapp:

private void btnAdd_Click(object sender, RoutedEventArgs e)
{
age = int.Parse(txtBoxAge.Text);
firstName = txtBoxName.Text;
lastName = txtBoxLastName.Text;

Person person = new Person()
{
Age = age,
Money = 0,
FirstName = firstName,
LastName = lastName
};
people.Add(person);
lstBoxPeople.ItemsSource = null;
lstBoxPeople.ItemsSource = people;

Och pengarna fördelas med en annan knapp. Det jag finner klurigt är att nu kalla på min metod som fördelar pengarna och på så sätt ändra värdet på "Money" för vardera person i listan:

private void btnDistributeMoney_Click(object sender, RoutedEventArgs e)
{
moneyToDistribute = int.Parse(txtBoxMoney.Text);

}

Permalänk

Det ser nästan helt rätt ut dock så blir det fel i moneyToDistribute = int.Parse(txtBoxMoney.Text) antar jag. moneyToDistribute är en metod du har så du bör kalla på den på samma sätt man kallar på metoder.

Permalänk
Skrivet av Indefinite:

Det ser nästan helt rätt ut dock så blir det fel i moneyToDistribute = int.Parse(txtBoxMoney.Text) antar jag. moneyToDistribute är en metod du har så du bör kalla på den på samma sätt man kallar på metoder.

Om jag exempelvis har int money = int.Parse(txtBoxMoney.Text) och sedan vill köra moneyToDistribute(money); fungerar det inte. Kan inte "nå" metoden trots att jag har DistributeMoney distributeMoney = new DistributeMoney();. Och om jag t.ex. kör DistributeMoney.moneyToDistribute(money); ändras ändå inte värdena på Money för vardera person, utan står kvar som 0. Förstår inte vad jag gör för fel då allt annat verkar vara rätt.

Permalänk
Medlem

@Elliedoso: Du visar inte hur du använder DistributeMoney-klassen, men om du har en instans av klassen som heter distributeMoney så anropar du metoden med distributeMoney.moneyToDistribute(money). Men du verkar ha andra problem också eftersom du lägger till nya personer i people istället för distributeMoney.People (en metod i DistributeMoney för att lägga till en ny person kan vara en bra idé).

Din moneyToDistribute-metod är dock fel. För det första är dess namn missvisande, ett bättre namn vore distributeMoney (eller bara distribute). Och för det andra så loopar du just nu igenom varje krona och ger varje person en krona för varje krona att distribuera, så alla personer kommer få hela beloppet.

Och ett litet forumtips, använd code-taggar för att lägga in kod så bevaras formateringen:
[code]
Kod här
[/code]

Permalänk
Medlem

Jag kommer skriva i lite blandad pseudo och svenska så du inte får koden serverad, annars lär man sig inget
Ponera följande, du har som presenterad ovan en lista över personer som du kan iterera.
Du har sedan en känd summa pengar, säg 3 kr på 3 personer.

Om du itererar varje person så ska summan delas på dessa. Det känns betydligt enklare om du använder Math.Floor:

Såhär som du skrivit kan man inte göra eftersom din kod försöker delegera ett värde till en funktion istället för att anropa funktionen med ett värde:

private void btnDistributeMoney_Click(object sender, RoutedEventArgs e) { moneyToDistribute = int.Parse(txtBoxMoney.Text); }

medan du egentligen vill göra såhär:

//någonstans måste du ha skapat en instans av DistributeMoney: DistributeMoney dm = new DistributeMoney(); //troligen vill du instansiera denna i roten av din klass så du får global access till den i din Form1.cs private void btnDistributeMoney_Click(object sender, RoutedEventArgs e) { //notera att vi hämtar instansen av dm som vi skrev här, då får vi tillgång till funktionen dm.moneyToDistribute(int.Parse(txtBoxMoney.Text)); }

Dock vore nog din kod lite snabbare om du gjorde såhär:

public void moneyToDistribute(int money) { //beräkna vad varje person bör få baserat på parameter money int _tempSummaAttGeVarjePerson = Math.Floor(money / lista av personer med 3 instanser.Count); //iterera din användare för varje person i lista av personer med 3 instanser {    //delegera dem summan pengar, förutsätter att du kör en foreach-loop där du delegerar den temporära variabeln namnet p    p.Money += _tempSummaAttGeVarjePerson; } }

Kod jag skrivit här kan du få hjälp med genom:
https://docs.microsoft.com/en-us/dotnet/api/system.math.floor...
https://docs.microsoft.com/en-us/dotnet/csharp/language-refer...
https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/o...

@perost har dock helt rätt

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
Felkod40

Permalänk
Medlem
Skrivet av Elliedoso:

public class DistributeMoney
{
List<Person> People { get; set; } = new List<Person>();

public void moneyToDistribute(int money) // min metod som ska fördela pengarna
{
for (int i = 0; i <= money; i++)
foreach (Person person in People)
{
person.Money++;
}
}
}

Så ser min klass och metod ut. Sedan lägger jag till x antal personer i en lista med en knapp:

private void btnAdd_Click(object sender, RoutedEventArgs e)
{
age = int.Parse(txtBoxAge.Text);
firstName = txtBoxName.Text;
lastName = txtBoxLastName.Text;

Person person = new Person()
{
Age = age,
Money = 0,
FirstName = firstName,
LastName = lastName
};
people.Add(person);
lstBoxPeople.ItemsSource = null;
lstBoxPeople.ItemsSource = people;

Och pengarna fördelas med en annan knapp. Det jag finner klurigt är att nu kalla på min metod som fördelar pengarna och på så sätt ändra värdet på "Money" för vardera person i listan:

private void btnDistributeMoney_Click(object sender, RoutedEventArgs e)
{
moneyToDistribute = int.Parse(txtBoxMoney.Text);

}

Nu ögnar jag bara lite fort igenom din kod men när du "distribuerar" pengarna (som jag antar skall delas lika mellan alla?) så ser det lite konstigt ut. Du har en forloop som går mellan 0 och antalet pengar. I denna itererar du sedan över alla personer och inkrememnterar deras Money med 1. Det gör ju att om du har 100 personer och sätter money till 100 så kommer de inte få 10 var utan de kommer få 100 var. Detta då din foorloop i så fall går mellan 0 och 100 och i varje steg adderas 1 till varje persons Money.

Om jag tolkat det rätt och pengarna skall fördelas så borde du börja med att dela antalet pengar som skall distribueras på antalet människor och sedan loopa igenom alla människor och addera den summan till varje persons Money.
Sedan behöver du i så fall välja hur du skall hantera om detta inte går jämt ut då du kör med integers.

Visa signatur

Huvudriggen är en Gigabyte Aorus Xtreme | 128gb DDR5 6000 | Ryzen 7950X | 3080Ti
Utöver det är det för många datorer, boxar och servar för att lista :P