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 
1 2 все