powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Интересная сортировка List<Category>
10 сообщений из 10, страница 1 из 1
Интересная сортировка List<Category>
    #38135073
avolik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, пока пытаюсь сам реализовать, но мало ли, если кто имеет опыт в реализации подобного, был бы рад увидеть предложения.

Сам то справлюсь с этой задачей, но вдруг кто быстрее подскажет как поизящнее реализовать следующее:

Есть пользовательский тип

Код: c#
1.
2.
3.
4.
5.
6.
7.
//тип для хранения категории/подкатегории
class Category
{
      public int CategoryId { get; set; }
      public int ParentCategoryId { get; set; }
      public string CategoryName { get; set; }
}



Есть список всех категорий и подкатегорий, взятых из одной таблицы БД (категории и их подкатегории хранятся в одной таблице):

Код: c#
1.
List<Category> categories;



Так вот. В этом списке элементы, представляющие собой категории и подкатегории не отсортированы.

Требуется так отсортировать этот список, что бы после каждого элемента категории шли все элементы его подкатегории, потом опять один элемент следующей категории и за ним несколько (все его) элементы подкатегории.

При этом, желательно, что бы элементы категорий шли в том же порядке, что и в изначальном виде неотсортированного списка.
Таким образом, ожидается, что бы оставить порядок следования категорий, но за каждой категорией шли ВСЕ её подкатегории вплоть до следующего элемента категории.
...
Рейтинг: 0 / 0
Интересная сортировка List<Category>
    #38135459
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avolik,

рекурсия; что-то типа такого:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
class Category
{
    public int CategoryId { get; set; }
    public int ParentCategoryId { get; set; }
    public string CategoryName { get; set; }
}

class Program
{
    static void smartSort(Category category)
    {
        sorted.Add(category);
        foreach (var cat in categories.Where(c => c.ParentCategoryId == category.CategoryId))
        {
            smartSort(cat);
        }
    }

    static List<Category> categories;
    static List<Category> sorted = new List<Category>();

    static void Main(string[] args)
    {
        categories = new List<Category>
        {
            new Category { CategoryId=1 , ParentCategoryId=0, CategoryName="aaa" },
            new Category { CategoryId=21, ParentCategoryId=2, CategoryName="bbb" },
            new Category { CategoryId=11, ParentCategoryId=1, CategoryName="ccc" },
            new Category { CategoryId=12, ParentCategoryId=1, CategoryName="ddd" },
            new Category { CategoryId=2 , ParentCategoryId=0, CategoryName="eee" }
        };

        foreach (var cat in categories.Where(c => c.ParentCategoryId == 0))
            smartSort(cat);

        foreach (var cat in sorted)
        {
            Console.WriteLine(cat.ParentCategoryId + " " + cat.CategoryId + " " + cat.CategoryName);
        }
    }
}
...
Рейтинг: 0 / 0
Интересная сортировка List<Category>
    #38136200
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avolik,

сортировка в .Net сводится к написанию правильного компаратора
...
Рейтинг: 0 / 0
Интересная сортировка List<Category>
    #38136438
Noriffik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Интересная сортировка List<Category>
    #38137253
avolik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationavolik,

сортировка в .Net сводится к написанию правильного компаратора - это без сомнений!
...
Рейтинг: 0 / 0
Интересная сортировка List<Category>
    #38137321
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avolikpationavolik,

сортировка в .Net сводится к написанию правильного компаратора - это без сомнений!

вот и напиши, там кода 5 строк
...
Рейтинг: 0 / 0
Интересная сортировка List<Category>
    #38137401
LameUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avolikpationavolik,

сортировка в .Net сводится к написанию правильного компаратора - это без сомнений!

На вскидку компаратор:


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var categories = new List<Category>
                                 {
                                     new Category {CategoryId = 1, ParentCategoryId = 0, CategoryName = "aaa"},
                                     new Category {CategoryId = 21, ParentCategoryId = 2, CategoryName = "bbb"},
                                     new Category {CategoryId = 11, ParentCategoryId = 1, CategoryName = "ccc"},
                                     new Category {CategoryId = 12, ParentCategoryId = 1, CategoryName = "ddd"},
                                     new Category {CategoryId = 2, ParentCategoryId = 0, CategoryName = "eee"}
                                 };

            categories.Sort(new CategoryComparer());
            categories.ForEach(category => Console.WriteLine(string.Format("{0}, id = {1}, ParentId = {2}", category.CategoryName, category.CategoryId, category.ParentCategoryId)));
            Console.ReadLine();
        }
    }

    internal class Category
    {
       
        public int CategoryId { get; set; }
        public int ParentCategoryId { get; set; }
        public string CategoryName { get; set; }
    }

    internal class CategoryComparer : IComparer<Category>
    {
        public const int ParentEmptyValue = 0;

        public int Compare(Category x, Category y)
        {

            if (x.ParentCategoryId == y.ParentCategoryId)
                return x.CategoryId.CompareTo(y.CategoryId);

            if (x.ParentCategoryId == ParentEmptyValue)
            {
                return x.CategoryId == y.ParentCategoryId ? -1 : x.CategoryId.CompareTo(y.ParentCategoryId);
            }

            return x.ParentCategoryId.CompareTo(y.ParentCategoryId);
        }
    }
}


...
Рейтинг: 0 / 0
Интересная сортировка List<Category>
    #38137596
LameUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LameUseravolikпропущено...
- это без сомнений!

На вскидку компаратор:


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var categories = new List<Category>
                                 {
                                     new Category {CategoryId = 1, ParentCategoryId = 0, CategoryName = "aaa"},
                                     new Category {CategoryId = 21, ParentCategoryId = 2, CategoryName = "bbb"},
                                     new Category {CategoryId = 11, ParentCategoryId = 1, CategoryName = "ccc"},
                                     new Category {CategoryId = 12, ParentCategoryId = 1, CategoryName = "ddd"},
                                     new Category {CategoryId = 2, ParentCategoryId = 0, CategoryName = "eee"}
                                 };

            categories.Sort(new CategoryComparer());
            categories.ForEach(category => Console.WriteLine(string.Format("{0}, id = {1}, ParentId = {2}", category.CategoryName, category.CategoryId, category.ParentCategoryId)));
            Console.ReadLine();
        }
    }

    internal class Category
    {
       
        public int CategoryId { get; set; }
        public int ParentCategoryId { get; set; }
        public string CategoryName { get; set; }
    }

    internal class CategoryComparer : IComparer<Category>
    {
        public const int ParentEmptyValue = 0;

        public int Compare(Category x, Category y)
        {

            if (x.ParentCategoryId == y.ParentCategoryId)
                return x.CategoryId.CompareTo(y.CategoryId);

            if (x.ParentCategoryId == ParentEmptyValue)
            {
                return x.CategoryId == y.ParentCategoryId ? -1 : x.CategoryId.CompareTo(y.ParentCategoryId);
            }

            return x.ParentCategoryId.CompareTo(y.ParentCategoryId);
        }
    }
}




Работать будет только если всего 2 уровня дерева. При 3 и более нужно будет учитывать уровень категории. Просто не видно исходных данных
...
Рейтинг: 0 / 0
Интересная сортировка List<Category>
    #38139023
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
LameUserПросто не видно исходных данных
А без них что-то экспериментировать бесполезно.

avolik,
Дайте пример. Что есть на входе, что должно быть на выходе.
...
Рейтинг: 0 / 0
Интересная сортировка List<Category>
    #38140794
avolik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Та, собственно, уже с помощью выше уже все написал. спасибо, уже работает.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Интересная сортировка List<Category>
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]