C# Как создать коллекцию людей, а затем распечатать их отсортированным определенным образом? - PullRequest
1 голос
/ 30 марта 2020

Это мой первый вопрос на этом сайте, и я действительно застрял с проблемой в C#;

Я пытаюсь создать список, содержащий x количество людей, основываясь на пользовательском вводе. Когда список будет сгенерирован, мне нужно распечатать его отсортированным на основе проданных статей.

Вот моя проблема; После того, как это будет сделано, мне также нужно подключить людей к определенным уровням (например, один уровень -> 50 проданных статей, один уровень - 51-100 проданных статей и т. Д. c.)

Вывод должен выглядеть примерно так это:

Название Район Статьи проданы

Рич Нью-Йорк 199

1 Продавец достиг уровня 3: 100-199 статьи

Микки Алабама 202

Снупи Техас 212

2 продавца достигли уровня 4: более 199 статей

Как можно go продвинуться с этим? Является ли решение списков в моем текущем коде хорошим способом или нет?

Это мой текущий код:

public class newPerson
{
    public string name { get; set; }
    public string district { get; set; }
    public string articlesSold { get; set; }
}

public class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine("How many people do you want to add to your collection?");
        int answer = Convert.ToInt32(Console.ReadLine());
        List<newPerson> personList = new List<newPerson>();

        for (int index = 0; index < answer; index++)
        {
            Console.WriteLine("Write person {0}:s name:", index + 1);
            personList.Add(new newPerson()
            {
                name = Console.ReadLine(),
                district = Console.ReadLine(),
                articlesSold= Console.ReadLine(),
            });
        }

        var sortedPersonList = personList.OrderByDescending(p => p.articlesSold);

        Console.WriteLine("Name     |     District    |     Amount    |     ");
        foreach (var p in sortedPersonList)
        {
            Console.WriteLine("\n");
            Console.Write((p.name) + "    |     ");
            Console.Write((p.district) + "    |     ");
            Console.Write((p.articlesSold + "    |     "));
        }
    }
}

Я думал о том, чтобы сначала создать словарь вместо списков, но не уверен в какую сторону go. Если что-то неясно, я прошу прощения. Я очень новичок в программировании.

Ответы [ 3 ]

1 голос
/ 31 марта 2020

@ Raizee, общий подход к этому будет следующим:

  1. Добавьте свойство Level к каждому объекту Person, которое вычисляет уровень этого человека из количества проданных товаров .
  2. После того, как вы сгенерировали List<Person> группу людей вместе по их уровню.
  3. Для каждого уровня, если есть группа, которая существует для этого уровня, сортируйте эту группу в порядке возрастания. по количеству проданных товаров и выводу результатов.

Пример реализации вышеупомянутых трех шагов будет следующим:

using System;
using System.Collections.Generic;
using System.Linq;

namespace StackOverflowSandbox.ConsoleApp
{
    public class Person
    {
        public string Name { get; set; }
        public string District { get; set; }
        public int ArticlesSold { get; set; }

        public int Level
        {
            get
            {
                if (ArticlesSold > 199) // 200 and above
                    return 4;
                if (ArticlesSold > 99)  // [100,199]
                    return 3;
                if (ArticlesSold > 49)  // [50,99]
                    return 2;
                return 1;   // 49 and below
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var people = new List<Person>()
            {
                new Person() { Name = "Bob", District = "London", ArticlesSold = 500 },
                new Person() { Name = "Alice", District = "Detroit", ArticlesSold = 125 },
                new Person() { Name = "Jane", District = "New York", ArticlesSold = 150 },
                new Person() { Name = "Alex", District = "5", ArticlesSold = 500 }
            };

            var peopleGroupedByLevel = people
                .GroupBy(p => p.Level)
                .ToDictionary(g => g.Key, g => g.ToList());
            Console.WriteLine("Name | District | Amount");
            if (peopleGroupedByLevel.ContainsKey(1))
            {
                var levelOnePeople = peopleGroupedByLevel[1];
                Console.WriteLine($"{levelOnePeople.Count} Seller has reached level 1: less than 50 articles");
                var levelOnePeopleSortedByArticlesSold = levelOnePeople.OrderBy(p => p.ArticlesSold);
                PrintPeopleToConsole(levelOnePeopleSortedByArticlesSold);
            }
            if (peopleGroupedByLevel.ContainsKey(2))
            {
                var levelTwoPeople = peopleGroupedByLevel[2];
                Console.WriteLine($"{levelTwoPeople.Count} Seller has reached level 2: 50-99 articles");
                var levelTwoPeopleSortedByArticlesSold = levelTwoPeople.OrderBy(p => p.ArticlesSold);
                PrintPeopleToConsole(levelTwoPeopleSortedByArticlesSold);
            }
            if (peopleGroupedByLevel.ContainsKey(3))
            {
                var levelThreePeople = peopleGroupedByLevel[3];
                Console.WriteLine($"{levelThreePeople.Count} Seller has reached level 3: 100-199 articles");
                var levelTwoPeopleSortedByArticlesSold = levelThreePeople.OrderBy(p => p.ArticlesSold);
                PrintPeopleToConsole(levelTwoPeopleSortedByArticlesSold);
            }
            if (peopleGroupedByLevel.ContainsKey(4))
            {
                var levelFourPeople = peopleGroupedByLevel[4];
                Console.WriteLine($"{levelFourPeople.Count} Seller has reached level 4: More than 199 articles");
                var levelFourPeopleSortedByArticlesSold = levelFourPeople.OrderBy(p => p.ArticlesSold);
                PrintPeopleToConsole(levelFourPeopleSortedByArticlesSold);
            }
        }

        private static void PrintPeopleToConsole(IEnumerable<Person> people)
        {
            foreach (var person in people)
            {
                Console.WriteLine($"{person.Name} | {person.District} | {person.ArticlesSold}");
            }
        }
    }
}

Обратите внимание, что в этом примере я жестко закодировал ввод List<Person>, потому что я не хотел возиться с повторяющимся вводом людей.

0 голосов
/ 30 марта 2020

Я немного переписал:

public class Person
{
    public string Name { get; set; }
    public string District { get; set; }
    public int ArticlesSold { get; set; }

    public int Level
    {
        get
        {
            if (ArticlesSold <= 50) return 1;
            if (ArticlesSold > 50 && ArticlesSold <= 100) return 2;
            return 0;
        }
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine("How many people do you want to add to your collection?");
        var count = Convert.ToInt32(Console.ReadLine());
        var personList = new List<Person>();

        for (var index = 1; index <= count; index++)
        {
            Console.WriteLine("Write person {0}:s name:", index + 1);
            personList.Add(new Person()
            {
                Name = Console.ReadLine(),
                District = Console.ReadLine(),
                ArticlesSold = Convert.ToInt32(Console.ReadLine()),
            });
        }

        var sortedPersonList = personList.OrderByDescending(p => p.ArticlesSold);

        Console.WriteLine("Name     |     District    |     Amount    |    Level | ");
        foreach (var p in sortedPersonList)
        {
            Console.WriteLine("\n");
            Console.Write((p.Name) + "    |     ");
            Console.Write((p.District) + "    |     ");
            Console.Write((p.ArticlesSold + "    |     "));
            Console.Write((p.Level + "    |     "));
        }
    }
}
0 голосов
/ 30 марта 2020

В вашем классе newPerson может быть метод CalculateLevel. Возвращает уровень после вызова в Console.Write. Например:

public int CalculateLevel()
{
   if (articlesSold <= 50) return 1;
}

Тогда в вашем методе печати вы можете назвать его так:

Console.WriteLine($"Level: {p.CalculateLevel()}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...