Suren97 Ответов: 2

C# как сортировать продукты питания


У меня есть класс Food,поля которого-это имя, категория,цена и функция toString.
Я создал массив еды в основном.например`
Food[] f = new Food[5]
            {
                new Food("Apple","Fruit",200),
                new Food("Orange","Fruit",600),
                new Food("Tomato","Vegetable",100),
                new Food("Pork","Meat",2000),
                new Food("Rice","Grain",400)
            };

Затем в консоли просят нажать 1,2 или 3.если я нажму 1, он будет сортировать мой массив по имени,если я нажму 2, он будет сортировать мой массив по категории, А если я нажму 3, он будет сортировать мой массив по цене.Например я нажал 3 он будет выглядеть так`

new Food("Tomato","Vegetable",100),
new Food("Apple","Fruit",200),
new Food("Rice","Grain",400),
new Food("Orange","Fruit",600),
new Food("Pork","Meat",2000),

После сортировки опрос выполняется снова՝ с помощью цикла While

Что я уже пробовал:

class Food 
    {
        public string name;
        public string category;
        public int price;
        public Food(string a,string b,int c)
        {
            this.name = a;
            this.category = b;
            this.price = c;     
        }
        public string toString()
        {
            return this.name + " " + this.category + " " + this.price;
        }
}








class Sorting : IComparer<food>
    {
        public int Compare(Food x, Food y)
        {
            double d1 = x.price;
            double d2 = y.price;
            return d1 > d2 ? 1 : -1; //For double


            string s1 = x.name;
            string s2 = y.name;
            return String.Compare(x.name,y.name); // For string
        }
        
    }


static void Main(string[] args)
        {
            Food[] f = new Food[5]
            {
                new Food("Apple","Fruit",200),
                new Food("Orange","Fruit",600),
                new Food("Tomato","Vegetable",100),
                new Food("Pork","Meat",2000),
                new Food("Rice","Grain",400)
            };
            foreach (Food item in f)
            {
                Console.WriteLine(item.toString());
            }

            int x;
            while (true)
            {
                Console.WriteLine("\n\n 1.According to name\n 2.According to category \n 3.According to price");
                Console.Write("\n Enter your choice: ");
                x = int.Parse(Console.ReadLine());
                Array.Sort(f, new Sorting());
            foreach (Food item in f)
            {
                Console.WriteLine(item.toString());
            }
            }
            
        }

F-ES Sitecore

В чем же вопрос?

Suren97

он не работает, когда я нажимаю 1, он сортируется по цене, когда я нажимаю 2, 3 или 4 и так далее, он снова сортируется по цене.

Suren97

Мне нужно, когда я нажму 1,он будет сортировать мой массив по имени, если я нажму 2, он будет сортировать мой массив по категории, А если я нажму 3, он будет сортировать мой массив по цене. И когда я нажму больше 3 он покажет ошибку

2 Ответов

Рейтинг:
20

F-ES Sitecore

Пройдитесь по коду с помощью отладчика, и вы увидите, что происходит внутри вашего класса сравнения. Он всегда делает сравнение цен, потому что они являются первыми тремя строками, и когда вы "возвращаете" функцию, она существует, поэтому она никогда не достигнет кода после нее.

Вам понадобится другой сортировщик для каждого типа сортировки, который вы хотите сделать

class PriceSorting : IComparer<Food>
{
    public int Compare(Food x, Food y)
    {
        double d1 = x.price;
        double d2 = y.price;
        return d1 > d2 ? 1 : -1; //For double
    }

}

class NameSorting : IComparer<Food>
{
    public int Compare(Food x, Food y)
    {
        string s1 = x.name;
        string s2 = y.name;
        return String.Compare(x.name, y.name); // For string
    }

}


затем решите, какой из них использовать, основываясь на их выборе

x = int.Parse(Console.ReadLine());
switch(x)
{
    case 1:
        Array.Sort(f, new NameSorting());
        break;
    case 3:
        Array.Sort(f, new PriceSorting());
        break;
}


Suren97

Большое вам спасибо :)

Maciej Los

5ed!

Рейтинг:
2

Maciej Los

Вы можете использовать В LINQ[^] методы:
1. Перечислимый.Заказатьпо(Метод TKey) Способ (Интерфейс IEnumerable(Метод), Функция(Метод TKey)) (System.Linq)[^]
2. Перечислимый.Метод OrderByDescending (System.Linq)[^]
3. Перечислимый.Метод ThenBy (System.Linq)[^]
4. Перечислимый.ThenByDescending Метод (System.Linq)[^]

Например:

//get foods ordered by Category and Name
var FoodsByCategoryAndName = f.OrderBy(x=>x.category).ThenBy(x=>x.name);

//get foods ordered by Category and Price (descending)	
var FoodsByCategoryAndPrice = f.OrderBy(x=>x.category).ThenByDescending(x=>x.price);