[英]How to print and sort list of sellers based on Bonus Tier in C#
我真的是 C# 的新手,請不要因此恨我。
我正在嘗試打印賣家列表。
該列表基於4 個獎勵等級/級別,具體取決於這些賣家售出的文章數量。
Level1:50篇以下
Level2:50-99篇文章
Level3:100-199篇文章
Level4:超過 199 篇文章。
打印時,您應該根據他們賣出的文章數來計算他們達到了哪個級別。
該程序還應將 output 寫入文件。
我已經創建了下面的程序來完成這項工作,但我被困在發生排序/打印的部分。
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace BonusCounter
{
class Program
{
/*
* Main method of the consoleprogram.
* Creates a program and runs "SalesObject" not more than 6 times.
*/
public static void Main(string[] args)
{
StringBuilder LogString = new StringBuilder();
List<SalesObject> salesList = new List<SalesObject>();
// Test data
/*salesList.Add(new SalesObject("Kalle Anka", "000", "Ankeborg", 39));
salesList.Add(new SalesObject("Joakim von Anka", "000", "Ankeborg", 198));
salesList.Add(new SalesObject("Alexander Lukas", "000", "Ankeborg", 201));*/
salesList.Add(new SalesObject("Seller 1", "000", "London", 77));
salesList.Add(new SalesObject("Seller 2", "000", "Edinburg", 44));
salesList.Add(new SalesObject("Seller 3", "000", "Manchester", 33));
// Add a seller
Console.WriteLine("How many sellers to you want to register?");
Console.Write("Max 6 seller at a time: ");
int j = Convert.ToInt32(Console.ReadLine());
// Loops through the lines.
for (int i = 0; i < j; i++)
{
salesList.Add(SalesObject.GetSeller());
}
// Count
salesList.Sort();
int currentLevel = Tier.Levels.Length;
int sellersInCurrentGroup = 0;
foreach (SalesObject seller in salesList)
{
int bonusGroup = Tier.BonusGroup(seller);
if (bonusGroup < currentLevel)
{
PrintBonusLevelSummary(sellersInCurrentGroup, currentLevel);
currentLevel -= 1;
sellersInCurrentGroup = 0;
}
Logger.Out(seller.ToString());
sellersInCurrentGroup += 1;
}
PrintBonusLevelSummary(sellersInCurrentGroup, currentLevel);
/* Print the result to a file
* Filepath for write operation is relative to the project, file is situated in "\bin\Debug\netcoreapp{version}"
* The file is named "Inl2.txt" */
string logFile = Environment.CurrentDirectory + @"\Inl2.txt";
File.WriteAllText(logFile, Logger.LogString.ToString());
Console.WriteLine("\n");
Console.WriteLine($"The result has been saved in: {logFile}");
Console.WriteLine("Press ENTER to exit...");
ConsoleKeyInfo keyInfo = Console.ReadKey();
while (keyInfo.Key != ConsoleKey.Enter)
keyInfo = Console.ReadKey();
}
// Print to console and handle the Teir sort.
public static void PrintBonusLevelSummary(int sellersInCurrentGroup, int currentLevel)
{
if (currentLevel == 0)
Logger.Out("No one have reached any level");
if (currentLevel == Tier.Levels.Length)
{
// Level 4
Logger.Out(
$"{sellersInCurrentGroup} seller have reached level {currentLevel}: {Tier.Levels[Tier.Levels.Length - 1]}+ articles");
Logger.Out("-------------------------------------------");
Logger.Out("");
}
else
{
// Rest of the levels
Logger.Out(
//WriteToConsoleAndFile($"{agents.ToList().Count} har nått nivå {GetSalesLevel(agents)}\n");
$"{sellersInCurrentGroup} seller have reached level {currentLevel}: {Tier.Levels[currentLevel - 1]}-{Tier.Levels[currentLevel]} articles");
Logger.Out("-------------------------------------------");
Logger.Out("");
}
}
}
/*
* Main class of the consoleprogram.
* Object to keep track of the variables of a seller for easier handling of the data.
* Contains methods for getting all variables. Variables can be set when object is created.
*/
public class SalesObject : IComparable<SalesObject>
{
// Variables
private readonly string _name;
private readonly string _personnr;
private readonly string _district;
public readonly int _articles;
// Array of above variables, create an object with constructor
public SalesObject(string name, string personnr, string district, int articles)
{
_name = name;
_personnr = personnr;
_district = district;
_articles = articles;
}
// Methods, take in sellers.
public static SalesObject GetSeller()
{
Logger.Out("Name:");
string name = Console.ReadLine();
Logger.Out("Personal number:");
string personnr = Console.ReadLine();
Logger.Out("District:");
string district = Console.ReadLine();
Logger.Out("Amount of articles sold:");
int articles = Convert.ToInt32(Console.ReadLine());
return new SalesObject(name, personnr, district, articles);
}
public int CompareTo(SalesObject seller)
{
return -_articles.CompareTo(seller._articles);
}
public string ToString()
{
return _name + "\t" + _personnr + "\t" + _district + "\t" + _articles;
}
}
// Class that handles the tiers.
public class Tier
{
public static readonly int[] Levels = { 1, 50, 100, 200 }; // change tiers here
public static int BonusGroup(SalesObject seller)
{
int articles = seller._articles;
if (articles < 1) // Return 0 if seller didn't sell anything
return 0;
int bonusLevel = 1;
for (int i = 0; i < Levels.Length; i++)
{
if (bonusLevel == Levels.Length) // Return the hights tier.
return bonusLevel;
if (Levels[i] <= articles && articles < Levels[i + 1]
)
// Checks if the current object is the last in its tier.
return bonusLevel;
bonusLevel += 1;
}
return 0; //default
}
}
// The class that handles the file output
public static class Logger
{
public static StringBuilder LogString = new StringBuilder();
public static void Out(string str)
{
Console.WriteLine(str);
LogString.Append(str).Append(Environment.NewLine);
}
}
}
您可以運行代碼,它會詢問您要注冊多少個賣家,代碼中有 3 個測試賣家,用於測試 porpuse。
它應該像這樣打印:
Name Persnr District articles
0 seller have reached level 4: 200+ articles
------------------------------------------
0 seller have reached level 3: 100-200 articles
------------------------------------------
Seller 1 000 London 77
1 seller have reached level 2: 50-100 articles
-------------------------------------------
Seller 2 000 Edinburg 44
Seller 3 000 Manchester 33
2 seller have reached level 1: 1-50 articles
-------------------------------------------
0 seller have reached level 4: 200+ articles
------------------------------------------
Seller 1 000 London 77
1 seller have reached level 3: 100-200 articles
------------------------------------------
Seller 2 000 Edinburg 44
1 seller have reached level 2: 50-100 articles
-------------------------------------------
Seller 3 000 Manchester 33
1 seller have reached level 1: 1-50 articles
-------------------------------------------
int currentLevel = Tier.Levels.Length; int sellersInCurrentGroup = 0; foreach (SalesObject seller in salesList) { int bonusGroup = Tier.BonusGroup(seller); if (bonusGroup < currentLevel) { PrintBonusLevelSummary(sellersInCurrentGroup, currentLevel); currentLevel -= 1; sellersInCurrentGroup = 0; } Logger.Out(seller.ToString()); sellersInCurrentGroup += 1; } PrintBonusLevelSummary(sellersInCurrentGroup, currentLevel);
讓我們分解一下您如何按獎勵等級對賣家進行排序。
使用上面的代碼塊,您基本上是在說“去每個賣家,檢查它的bonusGroup
是什么。然后如果它的獎勵組小於我們應該的currentLevel
,打印組摘要,將currentLevel
減1
並將sellersInCurrentGroup
重置回0
. 然后打印賣主,將sellersInCurrentGroup
增加1
。
所有這些事情單獨來說都是有意義的,但是按照你擁有它們的順序,實際效果是“當我遇到任何低於currentLevel
的賣家放棄並轉移到下一層,但也要打印它們並將它們添加到下一層。” 這不是我們想要的。
我們應該寫一些“去每一層,檢查每個賣家,看看他們是否在這個層中,如果他們在,我們應該打印它們並將一個添加到sellersInCurrentGroup
,然后打印該組的摘要。” 我們應該會發現這更符合我們對您預期的 output 的要求。
這是該實現可能是什么樣子的一個簡短示例。
int sellersInCurrentGroup;
// go to each tier
for (int currentLevel = Tier.Levels.Length; currentLevel-- > 1;)
{
// reset the people in this tier
sellersInCurrentGroup = 0;
// go to each seller and see if they're in this tier
foreach (SalesObject seller in salesList)
{
// get the seller's tier
int bonusGroup = Tier.BonusGroup(seller);
// check to see if it's this tier
if (bonusGroup == currentLevel)
{
// since they were in this tier, increase the number of
// sellers in this tier by 1
sellersInCurrentGroup += 1;
// print their name
Logger.Out(seller.ToString());
}
}
// now that we have counted all the sellers in this tier
// print the tier summary
PrintBonusLevelSummary(sellersInCurrentGroup, currentLevel);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.