Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Собрать список?

1052  1 2 все
Murr патриот21.06.19 13:12
Murr
21.06.19 13:12 

Пятничная задачка - Собрать список?


Дано:

Табличка DataTable из одного поля.

Есть враппер для типизированной строки и итератор по строкам.


Требуется:

сделать список содержимого полей с разделением запятыми.


текущий код:

public String GetList()
{
string temp = string.Empty;
string comma = string.Empty;

foreach (Row row in this)
{

temp += comma + row.Field;

comma = ", ";
}
return temp;

}

слишком громоздок. смущ


Дополнительные требования:

не использовать foreach - делать LINQом.

не использовать в явном виде промежуточную строку - использовать String.Join(",", list);

#1 
Murr патриот21.06.19 16:04
Murr
NEW 21.06.19 16:04 
в ответ Murr 21.06.19 13:12

Оказалось - достаточно примитивно:

return string.Join(", ", this.Select(r => ((Row)r).OrderNo));

Две проблемы:

- итератор все же не на уровне этого класса, а базового - т.е. без каста Студия не видит поля.

- там же в базовом классе есть метод Селект - закрывает ЛИНКовский - либо нужен тхис, либо писать Селект<стринг>(...);


А так - нич, мне понравилось...

#2 
AlexNek патриот21.06.19 21:33
AlexNek
NEW 21.06.19 21:33 
в ответ Murr 21.06.19 13:12, Последний раз изменено 21.06.19 21:41 (AlexNek)
не использовать в явном виде промежуточную строку - использовать String.Join(",", list);

Можно пояснить откуда взялось данное требование? Снимается было прочитано как "не использовать String.Join(",", list);" потому как String.Join туда именно что и просился и проблем никаких не видно было.

#3 
AlexNek патриот21.06.19 21:37
AlexNek
NEW 21.06.19 21:37 
в ответ Murr 21.06.19 16:04, Последний раз изменено 21.06.19 21:41 (AlexNek)
return string.Join(", ", this.Select(r => ((Row)r).OrderNo));

откуда взялся OrderNo, его в начальном задании не было смущ, и string.Join используется, что было "запрещено".

А отчего Sort не пользуется успехом? Проклянут тебя последователи.

#4 
Murr патриот23.06.19 00:03
Murr
NEW 23.06.19 00:03 
в ответ AlexNek 21.06.19 21:37

Лениво было на Field поменять - скопи-пастил как было в коде.


И какой тебе Sort нужен? Я бы дерябнул Абсолюта... но сегодня был в Лимерике в азиатском ресторане - там вкусно покушал и ничего такого не хочется...

#5 
Murr патриот23.06.19 00:43
Murr
NEW 23.06.19 00:43 
в ответ Murr 23.06.19 00:03

Модификация начальной задачи.


Условия - те же.


Дополнительное требование:

- нужно возвращать массив строк, каждая из которых содержит не более n элементов.

#6 
Программист коренной житель23.06.19 08:15
NEW 23.06.19 08:15 
в ответ Murr 23.06.19 00:43

foreach работает на интерфейсе IEnumerable<T> (LINQ - просто расширение этого интерфейса).

Соответственно никто не мешает тебе расширить IEnumerable<T> функцией

public static T[] ToArray(this IEnumerable<T> enumerable, int maxCount)
{
   ...
}

#7 
Murr патриот23.06.19 10:16
Murr
NEW 23.06.19 10:16 
в ответ Программист 23.06.19 08:15

Это - да, ничего не мешает.

Только вот в условиях задачки указано требование - не использовать foreach (добавлю - while, for, do, ForEach), а делать исключительно LINQом.

Просто группировка по полю - это без проблем, а вот по количеству - пока не понятно...


#8 
AlexNek патриот23.06.19 12:27
AlexNek
NEW 23.06.19 12:27 
в ответ Murr 23.06.19 00:03, Последний раз изменено 23.06.19 12:36 (AlexNek)
И какой тебе Sort нужен?

мне никакой не нужен, он нужен тебе. Мне просто интересно было узнать от чего тебе понравился селект, а не сорт - от меньшего количества букв?


Уупс, сорт тебе тоже не нужен ... сбил ты меня OrderNo смущ

#9 
AlexNek патриот23.06.19 12:39
AlexNek
NEW 23.06.19 12:39 
в ответ Murr 23.06.19 00:43
нужно возвращать массив строк, каждая из которых содержит не более n элементов.

A Take чем не подходит?

#10 
Murr патриот23.06.19 14:17
Murr
NEW 23.06.19 14:17 
в ответ AlexNek 23.06.19 12:39

Может строку кода?

#11 
AlexNek патриот23.06.19 14:38
AlexNek
NEW 23.06.19 14:38 
в ответ Murr 23.06.19 14:17
Может строку кода?

одну - нету смущ

int[] grades = { 59, 82, 70, 56, 92, 98, 85 };

IEnumerable<int> topThreeGrades =
    grades.OrderByDescending(grade => grade).Take(3);

Console.WriteLine("The top three grades are:");
foreach (int grade in topThreeGrades)
{
    Console.WriteLine(grade);
}
/*
 This code produces the following output:

 The top three grades are:
 98
 92
 85
*/
#12 
Murr патриот23.06.19 15:44
Murr
NEW 23.06.19 15:44 
в ответ AlexNek 23.06.19 14:38

Требуется:

59, 82, 70

56, 92, 98

85

#13 
AlexNek патриот23.06.19 17:48
AlexNek
NEW 23.06.19 17:48 
в ответ Murr 23.06.19 15:44

А нафига тогда N элементов?

#14 
Murr патриот23.06.19 21:48
Murr
NEW 23.06.19 21:48 
в ответ AlexNek 23.06.19 17:48

В оракловском SQL при применении IN(...) количество элементов списка ограничено. Запихивать в таблицу - не хочется, проще сгенерировать IN() OR IN().

#15 
AlexNek патриот23.06.19 22:13
AlexNek
NEW 23.06.19 22:13 
в ответ Murr 23.06.19 21:48

Я имел в виду пример, что там с ораклом я уже давно не помню...

#16 
Murr патриот23.06.19 22:16
Murr
NEW 23.06.19 22:16 
в ответ AlexNek 23.06.19 22:13

Пример того, что нужно получить Я дал выше - 3, еще 3 и 1 в последней группе.

#17 
AlexNek патриот23.06.19 22:33
AlexNek
NEW 23.06.19 22:33 
в ответ Murr 23.06.19 22:16

А что такое "тройка"? Тебе надо элементы группировать? Чтобы определенное количество элементов в группе было?

А как вообще ты группы собираешься генерить?

#18 
AlexNek патриот23.06.19 22:35
AlexNek
NEW 23.06.19 22:35 
в ответ Murr 23.06.19 22:16

Может эта идея поможет?

https://stackoverflow.com/questions/17841108/linq-select-w...

#19 
AlexNek патриот23.06.19 22:39
AlexNek
NEW 23.06.19 22:39 
в ответ Murr 23.06.19 22:16

хотя бы так написал, а то перенос я просто проигнорировал, как обычный парсер улыб

Требуется:
{59, 82, 70}
{56, 92, 98}
{85}
#20 
Программист коренной житель23.06.19 22:43
NEW 23.06.19 22:43 
в ответ Murr 23.06.19 10:16
Только вот в условиях задачки указано требование - не использовать foreach (добавлю - while, for, do, ForEach), а делать исключительно LINQом.

Во-первых, LINQ использует foreach.

Во-вторых, чем тебе не нравится string.Join?

#21 
Murr патриот24.06.19 00:32
Murr
NEW 24.06.19 00:32 
в ответ AlexNek 23.06.19 22:35

Может эта идея поможет?

-----

Проблема в том, что Я не вижу как...

#22 
Murr патриот24.06.19 00:34
Murr
NEW 24.06.19 00:34 
в ответ Программист 23.06.19 22:43

Что ЛИНК испошьзует внутри - меня интересует очень мало.


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

#23 
Программист коренной житель24.06.19 08:21
NEW 24.06.19 08:21 
в ответ Murr 24.06.19 00:34
Вопрос в том, можно ли решить задачку в указанных ограничениях - без написания явных циклов.

return string.Join(", ", this.Select(r => ((Row)r).OrderNo), 1, 3);

#24 
Murr патриот24.06.19 10:37
Murr
NEW 24.06.19 10:37 
в ответ Программист 24.06.19 08:21

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

В том примере, который привел AlexNek, как раз получается массив из трех строк.


Ну вот - глянул в параметры - так и есть - начиная с и количество. Не то.

#25 
Программист коренной житель24.06.19 13:42
NEW 24.06.19 13:42 
в ответ Murr 24.06.19 10:37
      string[] grades = { "59", "82", "70", "56", "92", "98", "85" };
      IEnumerable<string> data =  grades.GroupBy(x => Array.IndexOf(grades, x) / 3, (x, list)=>string.Join(",", list));

А вообще странные у тебя словия и задачи :D :D :D

#26 
Murr патриот24.06.19 15:37
Murr
NEW 24.06.19 15:37 
в ответ Программист 24.06.19 13:42

А вообще странные у тебя словия и задачи

-----

Чем странны мои пятничные задачки?

Тем, что заставляют/позволяют взглянуть на вполне традиционные исходные данные и решение и, потом, подумать над несколько нестандартным решением в непонятных ограничениях?

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

Решение, кстати, мне понравилось. Компактностью. Именно то, что хотел.

Осталась, у меня, проблема - понять как оно работает. безум Ну да это моя проблема - куда рыть уже примерно понятно, осталось - рыть.

#27 
AlexNek патриот24.06.19 22:57
AlexNek
NEW 24.06.19 22:57 
в ответ Murr 24.06.19 00:32
Проблема в том, что Я не вижу как...

А у меня проблема понять что же тебе действительно нужно смущ

Нафига, уже даже и не думаю. спок

#28 
Murr патриот25.06.19 10:42
Murr
NEW 25.06.19 10:42 
в ответ AlexNek 24.06.19 22:57

Ну сейчас-то понЯл? смущ

#29 
Программист коренной житель25.06.19 11:16
NEW 25.06.19 11:16 
в ответ Murr 24.06.19 15:37
Осталась, у меня, проблема - понять как оно работает.

Группирует по индексу и далее формирует строку string.Join'ом

Если индекс элемента в массиве поделить на необходимое количество элементов в строке, то получится признак, по которому можно группировать.


Все просто. Я правда сомневаюсь в эффективности этого решения, но зато без циклов :D

#30 
Murr патриот25.06.19 11:38
Murr
NEW 25.06.19 11:38 
в ответ Программист 25.06.19 11:16

Группирует по индексу и далее формирует строку string.Join'ом

-----

Я понимаю что оно делает,

Я не понимаю как оно работает.

Т.е. не понимаю во что развернется выражение и как и какие параметры будут передаваться.

Пока - не понимаю. Надо копать.


Я правда сомневаюсь в эффективности этого решения

------

Решение - в указанных ограничениях - эффективно.

Остальное надо тестить, но будет не шибко плохо.

По крайней мере 30 строк с тремя циклами и пятеркой ифов - местами у меня именно так написано - эффективнее не будут.

У меня просто МНОГО кода. Любое сокращение объема - будет во благо. Даже с потерей производительности.

#31 
AlexNek патриот25.06.19 22:14
AlexNek
NEW 25.06.19 22:14 
в ответ Murr 25.06.19 10:42

ну как тебе сказать...

Теоретически как-то понятно , но непонятно зачем делать так, что самому нужно вначале разобраться. смущ

И зачем массив массивов, когда "удобнее" массив в цикле. Скобки специально для тебя бебе


#32 
Murr патриот25.06.19 22:36
Murr
NEW 25.06.19 22:36 
в ответ AlexNek 25.06.19 22:14

"удобнее"

------

Удобнее - бывает разное.

Мне сейчас удобнее - ужать размер кода, даже если Я чуток потеряю в производительности и малехо в читабельности/понимабельности.

Просто слишком много кода.


А понимабельность - придет со временем. Все одно эту часть придется доучивать. Еще и шаблоны в очереди...

#33 
Murr патриот19.07.19 14:09
Murr
NEW 19.07.19 14:09 
в ответ Murr 25.06.19 22:36

Вот подвсплыло еще немного LINQ...


Код:


List<DataColumn> duplicatedColumns = dt.Columns.Cast<DataColumn>()
.Where(dc => additionalColumns.Any(p => p.ColumnName == dc.ColumnName))
.ToList();
foreach(DataColumn column in duplicatedColumns)
{
dt.Columns.Remove(column);
}



Делает простую работу - удаляет из таблицы колонки которые там уже есть и есть в списке additionalColumns.

Остальное - остается на месте.


Почему так - не суть важно, но если интересно - заменяется тип колонки и дефаултное значение.


Вопросик над которым думаю:

- Можно ли написать все тоже самое, но без цикла в конце?

Т.е. нужно чтобы дублирующие (по имени) колонки были удалены.


П.С. Про то, что LINQ не является языком манипулации данными Я в курсе. Как обойти?

П.П.С. Про то, что источник данных длйa итератора не должен менятся в процессе - разумеется тоже.

#34 
Murr патриот30.08.19 13:21
Murr
NEW 30.08.19 13:21 
в ответ Murr 19.07.19 14:09

Снова споткнулся об гения билли...


Задача - та же - собрать список с разделителями.


Измемения - одна часть списка уже собрана. Источник первой части уже не доступен.

Ограничения - собранная часть может быть нулл или емпти.

Стринг.Йон нас нуллах просто обломается, для пустой строки - добавит ненужный сепаратор.


Облом - надо пересраивать логику построения...


Хватит ли Униона для решения проблемы?

#35 
AlexNek патриот30.08.19 21:21
AlexNek
NEW 30.08.19 21:21 
в ответ Murr 30.08.19 13:21
Хватит ли Униона для решения проблемы?

А шо за товарищъ? А Иёфа Моиселсвича не хватит?

#36 
Murr патриот12.09.19 16:09
Murr
NEW 12.09.19 16:09 
в ответ AlexNek 30.08.19 21:21

не хватит?

-----

Нее, не хватит...

Униона - голого - тожА не хватило - пришлось заворачивать в массив...

#37 
AlexNek патриот12.09.19 21:53
AlexNek
NEW 12.09.19 21:53 
в ответ Murr 12.09.19 16:09
Нее, не хватит...

не понял, а что тебе не хватит?


if(String.IsNullOrEmpty(x))....

#38 
Murr патриот13.09.19 16:08
Murr
NEW 13.09.19 16:08 
в ответ AlexNek 12.09.19 21:53

что тебе не хватит?

-----

Эээ.... квадратного... в рыжу полосковую... смущ

#39 
1 2 все