簡體   English   中英

如何根據 C# 中的獎勵等級打印和排序賣家列表

[英]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。

預期 output

它應該像這樣打印:

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 ,打印組摘要,將currentLevel1並將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM