Сортировать элементы в списке - PullRequest
0 голосов
/ 30 января 2020

У меня есть список строк в C# ASP. net проекте, над которым я работаю. содержимое в списке выглядит примерно так:

Apple,1,monday
Banana,5,monday
Pear,4,tuesday
Apple,2,tuesday,
Banana,7,tuesday
Orange,6,wednesday
Apple,9,thursday,
Banana,2,friday

Список содержит тип фрукта, количество этого конкретного фрукта и день, в который он требуется, и количество. Я хочу отсортировать список по типу фруктов, затем по дням с понедельника по пятницу с каждым количеством для каждого дня. Например, для фруктового элемента «Яблоко» я хочу иметь запись в таблице, которая выглядит следующим образом.

Apple,1,2,0,9,0 

Элемент Apple отсортирован так, чтобы отображалось количество яблок, необходимое для понедельника, и, если есть без определенного количества яблок в определенный день, например, в среду и пятницу, затем отображается 0.

Идентификатор идентичный тому же, который применяется ко всем элементам в списке и т. п. c o для бананов, груш, апельсинов, или любой другой фрукт, который может быть в списке.

Любая помощь будет высоко ценится.

Пока у меня есть код ниже, это грязный подход, который я не могу заставить работать. оригинальный список называется "itemsFruitMon", а отсортированный список называется "отформатированный". Это не лучший подход, и я застрял в том, как продолжать.

            foreach (var item in itemsFruitMon)
        {
            foreach (var itemComp in itemsFruitMon)
            {
                if(item.Split(',')[0]==itemComp.Split(',')[0])
                {

                    if (itemComp.Contains("monday"))
                    {
                        formatted.Add(item.Split(',')[0] + "," + item.Split(',')[1].Split(',')[0]);  
                       // formatted.Add(item.Split(',')[0]+","+item.Split(',')[1].Split(',')[0]);                           
                    }
                    else
                    {
                        formatted.Add(item.Split(',')[0] + "," + 0);
                    }
                }

            }

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Вам не нужно делать никакой сортировки здесь.

Количество рабочих дней всегда равно 7. Вам нужно 0 для дней, когда фрукты не приходят. Таким образом, для каждого фрукта вам нужен массив из 7 элементов или список целых. Каждое имя дня недели является индексом в этом массиве или списке.

Парсер будет выглядеть примерно так:

var fruitDays = new Dictionary<string, int[]>();
foreach (var line in listOfLines)
{
    var fields = line.Split(',');
    var fruit = fields[0];
    var quantity = int.Parse(fields[1]);
    var weekday = (int)Enum.Parse(typeof(DayOfWeek), fields[2], true); // Case-weekday insensitive parsing. Keep in mind that Monday=0 and Sunday=0 here 
    if (!fruitDays.ContainsKey(fruit)) fruitDays.Add(fruit, new int[7]);
    fruitDays[fruit][weekday] = quantity;
}

2 голосов
/ 30 января 2020

Попробуйте IComparable, а затем создайте словарь

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Fruit> fruits = new List<Fruit>() {
                new Fruit() { fruit =  "Apple", quantity = 1, day = "monday"},
                new Fruit() { fruit =  "Banana", quantity = 5, day = "monday"},
                new Fruit() { fruit =  "Pear", quantity = 4, day = "tuesday"},
                new Fruit() { fruit =  "Apple", quantity = 2, day = "tuesday"},
                new Fruit() { fruit =  "Banana", quantity = 7, day = "tuesday"},
                new Fruit() { fruit =  "Orange", quantity = 6, day = "wednesday"},
                new Fruit() { fruit =  "Apple", quantity = 9, day = "thursday"},
                new Fruit() { fruit =  "Banana", quantity = 2, day = "friday"}
            };

            List<Fruit> results = fruits.OrderBy(x => x).ToList();

            Dictionary<string, List<Fruit>> dict = results.GroupBy(x => x.fruit, y => y)
                .ToDictionary(x => x.Key, y => y.ToList());
        }
    }
    public class Fruit : IComparable<Fruit>
    {
        public string fruit { get; set; }
        public int quantity { get; set; }
        dayofweek date { get; set; }
        public string day {
            get { return date.ToString();}
            set { date = (dayofweek)Enum.Parse(typeof(dayofweek), value);}
        }

        enum dayofweek
        {
            sunday = 0,
            monday = 1,
            tuesday = 2,
            wednesday = 3,
            thursday = 4,
            friday = 5,
            saturday = 6
        }

        public int CompareTo(Fruit other)
        {
            if (this.fruit != other.fruit)
            {
                return this.fruit.CompareTo(other.fruit);
            }
            else
            {
                if (this.date != other.date)
                {
                    return this.date.CompareTo(other.date);
                }
                else
                {
                    return this.quantity.CompareTo(other.quantity);
                }
            }

        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...