powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / оптимизация linq кода
15 сообщений из 15, страница 1 из 1
оптимизация linq кода
    #39766382
yura1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всезнающий пипл.
Подскажите как можно оптимизировать такой код:

Я бы хотел вывести формулу для level=N (case N) не могу придумать как это сделать. Я предполагаю, что нужно создать какой то цикл, но как это сделать в linq не могу придумать. Заранее спасибо

Код: 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.
 switch (level)
                    {
                        case 1:
                            {
                                item.Childs = GetAllNodes(data_all.Where(x => x.test[level - 1] == item.test[level - 1]
                                                                        && x.test[level] != 0
                                                                        && x.test[level + 1] == 0).ToList(), data_all);
                            }
                        case 2:
                            {
                                item.Childs = GetAllNodes(data_all.Where(x => x.test[level - 2] == item.test[level - 2]
                                                                          && x.test[level - 1] == item.test[level - 1]
                                                                          && x.test[level] != 0
                                                                          && x.test[level + 1] == 0).ToList(), data_all);
                            }
                        case 3:
                            {
                                item.Childs = GetAllNodes(data_all.Where(x =>  x.test[level - 3] == item.test[level - 3]
                                                                          && x.test[level - 2] == item.test[level - 2]
                                                                          && x.test[level - 1] == item.test[level - 1]
                                                                          && x.test[level] != 0
                                                                          && x.test[level + 1] == 0).ToList(), data_all);
                            }
                    }
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766385
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если решать тупо в лоб - Where можно скомбинировать в цикле
Код: c#
1.
2.
3.
4.
5.
for (int i....)
{
    var j = i;
    myEnumerable = myEnumerable.Where(x.test[j] == item.test[j]);
}
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766387
yura1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а условие && при этом добавляется (а если бы вместо && было ||)?
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766400
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura1985а условие && при этом добавляетсяпо сути - да, это просто как несколько Where подряд
yura1985а если бы вместо && было ||тут посложнее, понадобилось бы динамически сконструировать выражение (это применимо и для &&, просто для && этот способ проще для начала, а потом можно и переделать, если приспичит), для этого есть разные способы
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766405
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura1985,
Почему case не перемесить в GetAllNodes?
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766413
yura1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как в цикл впихнуть?

Код: c#
1.
2.
&& x.test[level] != 0
&& x.test[level + 1] == 0
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766419
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura1985а как в цикл впихнуть?А зачем их в цикл запихивать, если они статичны?
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766442
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura1985, это возможно бизнес логика. Самая ценная часть приложения....
Или фильтры в инет магазине..
Или...
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766446
yura1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно ли я понимаю...

что моя ф-я должна так выглядеть?

Код: c#
1.
2.
3.
4.
5.
6.
for (int i = level; i > 0; --i)
   {
       item.Childs = GetAllNodes(data_all.Where(x => x.test[level - 1] == item.test[level - 1].ToList(), data_all);
   }
       item.Childs = GetAllNodes(x => x.RoleMnu_Cd[level] != 0
                                                      && x.RoleMnu_Cd[level + 1] == 0).ToList(), data_all);
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766448
yura1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RoleMnu_Cd на test поменять нужно
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766451
yura1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин (написал невнимательно).... вот так?

for (int i = level; i > 0; --i)
{
item.Childs = GetAllNodes(data_all.Where(x => x.test[i - 1] == item.test[i - 1].ToList(), data_all);
}
item.Childs = GetAllNodes(x => x.test[level] != 0
&& x.test[level + 1] == 0).ToList(), data_all);
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766456
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura1985Блин (написал невнимательно).... вот так?

for (int i = level; i > 0; --i)
{
item.Childs = GetAllNodes(data_all.Where(x => x.test[i - 1] == item.test[i - 1].ToList(), data_all);
}
item.Childs = GetAllNodes(x => x.test[level] != 0
&& x.test[level + 1] == 0).ToList(), data_all);не приходит в голову, что из присвоений item.Childs = GetAllNodes будет действительно только последнее, а цикл можно вообще выкинуть?
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766458
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yura1985Правильно ли я понимаю...Что-то я вижу мало общего с тем, что я предложил, не вижу участия переменной цикла и вообще понимания работы кода.
Нужно завести переменную с выражением перечисления с начальным статичным фильтром
(код приблизительный, не анализировал на соответствие первоначальному)
Код: c#
1.
var myEnumerable = data_all.Where(x =>  x.test[level] != 0 && x.test[level + 1] == 0)

затем в цикле добавить дополнительные фильтры
Код: c#
1.
2.
3.
4.
5.
for (int i = level; i > 0; --i)
   {
       var j = i;
       myEnumerable = myEnumerable.Where(x => x.test[j - 1] == item.test[j - 1]);
   }

а потом уже выполнять материализацию и вызов GetAllNodes
Код: c#
1.
item.Childs = GetAllNodes(myEnumerable.ToList())
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766470
yura1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо... я уже как раз сам так же переписал. И смотрю Вы так же :) ГЕНИАЛЬНЫЕ РЕШЕНИЯ рекомендуете. Спасибо огромное!
...
Рейтинг: 0 / 0
оптимизация linq кода
    #39766579
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может тут необходимо использовать деревья выражений?
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / оптимизация linq кода
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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