powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
15 сообщений из 15, страница 1 из 1
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38387666
2king2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получается отсортировать!

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
var list = new List<string>
{
	"2.100.6",
	"2.100.5",
	"2.1",
	"10.2.4",
	"10.2.3",
	"1.1.1",
	"10.11.10",
	"10.10.10",
	"2.2.3",
	"2.10.10",
	"2.3.3"
};

var selectList = list.Select(x => Regex.Replace(string.Concat((string.Concat(".", x).Replace(".", ".".PadRight(10, '0'))), "."), @"(.*?)(\d{10})+$", @"\2")).OrderBy(x => x);

var sortedList = list.OrderBy(x => Regex.Replace(string.Concat((string.Concat(".", x).Replace(".", ".".PadRight(10, '0'))), "."), @"(.*?)(\d{10})+$", @"\2"));
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38387703
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2king2,

Ну почему-же не получается?
С точки зрения сортировки символьных строк абсолютно правильно сортировано.
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38387718
2king2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovНу почему-же не получается?
С точки зрения сортировки символьных строк абсолютно правильно сортировано.

Нужно не в символах правильно, а по числовой логике
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38387750
фиганыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2king2,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
(from a in (list.Select(a => new { abase = a, xs = a.Split('.') }).Select(a => new
            {
                x1 = Convert.ToInt32((a.xs.Length > 0 ? a.xs[0] : "0")),
                x2 = Convert.ToInt32((a.xs.Length > 1 ? a.xs[1] : "0")),
                x3 = Convert.ToInt32((a.xs.Length > 2 ? a.xs[2] : "0")),
                abase = a.abase
            }))
             orderby a.x1, a.x2, a.x3
             select a.abase).ToList().ForEach(a => Console.WriteLine(a));
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38387756
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38387769
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фиганыч, это же дерево, т.о. уровней может быть сколько угодно.
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38387784
фиганыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

ну вроде у TC максимум с 3 уровнями пример. если это максимум - то моё подойдёт, если нет - то Alex Kuznetsov ответил.
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38387820
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фиганычМСУ, ну вроде у TC максимум с 3 уровнями пример. если это максимум - то моё подойдёт, если нет - то Alex Kuznetsov ответил.
Алекс правильно ответил, согласен. Просто зачем нам прибивать ограничение, если можно сразу сделать компарер на лету? :)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Comparison<string> comparer = (a, b) => 
{
    var alist = a.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries).Select(x => Convert.ToInt32(x)).ToList();
    var blist = b.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries).Select(x => Convert.ToInt32(x)).ToList();

    int len = alist.Count > blist.Count ? alist.Count : blist.Count;

    for (int i = 0; i < len; i++)
    {
        int aitem = alist.Count > i ? alist[i] : 0;
        int bitem = blist.Count > i ? blist[i] : 0;

        if (aitem != bitem)
        {
            return aitem.CompareTo(bitem);
        }
    }

    return a.CompareTo(b);
};


list.Sort(comparer);
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38387828
2king2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята спасибо!
Но мне нужен такой код на LINQ, который я мог бы преобразовать в ORACLE PL/SQL

Вот я и пытался вот это рабочий код на ORACLE парировать в LINQ (т.е. пока на оборот)
Код: plsql
1.
order by regexp_replace(replace('.' || s, '.', rpad('.', 10, '0')) || '.', '(.*?)(\d{10}\.)', '\2')


Но не получается (((
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38387900
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2king2рабочий код на ORACLE
Ты форумом ошибся. Сюда надо .
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38388020
2king2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ2king2рабочий код на ORACLE
Ты форумом ошибся. Сюда надо .
Нет не ошибся)

Мне нужен код на LINQ, который я преобразую в самописной ORM уже в оракле
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38388033
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2king2Мне нужен код на LINQ, который я преобразую в самописной ORM уже в оракле

1. И как же ты собрался транслировать этот код в PL SQL?

Код: c#
1.
2.
3.
var selectList = list.Select(x => Regex.Replace(string.Concat((string.Concat(".", x).Replace(".", ".".PadRight(10, '0'))), "."), @"(.*?)(\d{10})+$", @"\2")).OrderBy(x => x);

var sortedList = list.OrderBy(x => Regex.Replace(string.Concat((string.Concat(".", x).Replace(".", ".".PadRight(10, '0'))), "."), @"(.*?)(\d{10})+$", @"\2"));



2. Почему сразу не поставил вопрос, чтобы это был транслируемый запрос? Или нужно догадаться об этом?

3. Я сомневаюсь, что можно написать LINQ запрос, который будет нормально транслироваться в SQL.

4. Не занимайся фигней. Либо напиши это на чистом PL SQL (как вариант, хранимая процедура), либо делай это на .NET.
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38388038
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5. А, вообще, сортировку можно смело выполнять средствами клиента, а не СУБД.
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38388058
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2king2Ребята спасибо!
Но мне нужен такой код на LINQ, который я мог бы преобразовать в ORACLE PL/SQL

Вот я и пытался вот это рабочий код на ORACLE парировать в LINQ (т.е. пока на оборот)
Код: plsql
1.
order by regexp_replace(replace('.' || s, '.', rpad('.', 10, '0')) || '.', '(.*?)(\d{10}\.)', '\2')


Но не получается (((Ну вот я тащусь от такого подхода к постановкам задач и вопросов...
Блииин, пипец, как-же это задалбывает - неполные вопросы выдранные из контекста задачи....

В общем, удачи Вам.
...
Рейтинг: 0 / 0
Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
    #38388236
2king2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ура, разобрался. Regex на ORACLE и в C# / LINQ разные. "\2" -> "$2"
Код: c#
1.
var sortedList = list.OrderBy(x => Regex.Replace(string.Concat(".", x, ".").Replace(".", ".".PadRight(10, '0')), @"(.*?)(\d{10}\.)", "$2")).ToList();



Все спасибо, за помощь!!!
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сортировка иерархических данных (1.1.1, 1.1.2 ... 10.41.242)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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