Собрать список?
Пятничная задачка - Собрать список?
Дано:
Табличка 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);
Оказалось - достаточно примитивно:
return string.Join(", ", this.Select(r => ((Row)r).OrderNo));
Две проблемы:
- итератор все же не на уровне этого класса, а базового - т.е. без каста Студия не видит поля.
- там же в базовом классе есть метод Селект - закрывает ЛИНКовский - либо нужен тхис, либо писать Селект<стринг>(...);
А так - нич, мне понравилось...
не использовать в явном виде промежуточную строку - использовать String.Join(",", list);
Можно пояснить откуда взялось данное требование? Снимается было прочитано как "не использовать String.Join(",", list);" потому как String.Join туда именно что и просился и проблем никаких не видно было.
return string.Join(", ", this.Select(r => ((Row)r).OrderNo));
откуда взялся OrderNo, его в начальном задании не было , и string.Join используется, что было "запрещено".
А отчего Sort не пользуется успехом? Проклянут тебя последователи.
Лениво было на Field поменять - скопи-пастил как было в коде.
И какой тебе Sort нужен? Я бы дерябнул Абсолюта... но сегодня был в Лимерике в азиатском ресторане - там вкусно покушал и ничего такого не хочется...
Модификация начальной задачи.
Условия - те же.
Дополнительное требование:
- нужно возвращать массив строк, каждая из которых содержит не более n элементов.
foreach работает на интерфейсе IEnumerable<T> (LINQ - просто расширение этого интерфейса).
Соответственно никто не мешает тебе расширить IEnumerable<T> функцией
public static T[] ToArray(this IEnumerable<T> enumerable, int maxCount) { ... }
Это - да, ничего не мешает.
Только вот в условиях задачки указано требование - не использовать foreach (добавлю - while, for, do, ForEach), а делать исключительно LINQом.
Просто группировка по полю - это без проблем, а вот по количеству - пока не понятно...
И какой тебе Sort нужен?
мне никакой не нужен, он нужен тебе. Мне просто интересно было узнать от чего тебе понравился селект, а не сорт - от меньшего количества букв?
Уупс, сорт тебе тоже не нужен ... сбил ты меня OrderNo
нужно возвращать массив строк, каждая из которых содержит не более n элементов.
A Take чем не подходит?
Может строку кода?
одну - нету
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 */
В оракловском SQL при применении IN(...) количество элементов списка ограничено. Запихивать в таблицу - не хочется, проще сгенерировать IN() OR IN().
Я имел в виду пример, что там с ораклом я уже давно не помню...
Пример того, что нужно получить Я дал выше - 3, еще 3 и 1 в последней группе.
А что такое "тройка"? Тебе надо элементы группировать? Чтобы определенное количество элементов в группе было?
А как вообще ты группы собираешься генерить?
хотя бы так написал, а то перенос я просто проигнорировал, как обычный парсер
Требуется: {59, 82, 70} {56, 92, 98} {85}
Только вот в условиях задачки указано требование - не использовать foreach (добавлю - while, for, do, ForEach), а делать исключительно LINQом.
Во-первых, LINQ использует foreach.
Во-вторых, чем тебе не нравится string.Join?
Что ЛИНК испошьзует внутри - меня интересует очень мало.
Вопрос в том, можно ли решить задачку в указанных ограничениях - без написания явных циклов.
Вопрос в том, можно ли решить задачку в указанных ограничениях - без написания явных циклов.
return string.Join(", ", this.Select(r => ((Row)r).OrderNo), 1, 3);
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
А вообще странные у тебя словия и задачи
-----
Чем странны мои пятничные задачки?
Тем, что заставляют/позволяют взглянуть на вполне традиционные исходные данные и решение и, потом, подумать над несколько нестандартным решением в непонятных ограничениях?
Ну так это пятничная задачка - возможность пошевелить мозгой, поупражнятся в извращениях, по-ошибаться и предложить что-то малоизвестное в качестве решения. И в результате - научится чему-то.
Решение, кстати, мне понравилось. Компактностью. Именно то, что хотел.
Осталась, у меня, проблема - понять как оно работает. Ну да это моя проблема - куда рыть уже примерно понятно, осталось - рыть.
Проблема в том, что Я не вижу как...
А у меня проблема понять что же тебе действительно нужно
Нафига, уже даже и не думаю.
Осталась, у меня, проблема - понять как оно работает.
Группирует по индексу и далее формирует строку string.Join'ом
Если индекс элемента в массиве поделить на необходимое количество элементов в строке, то получится признак, по которому можно группировать.
Все просто. Я правда сомневаюсь в эффективности этого решения, но зато без циклов :D
Группирует по индексу и далее формирует строку string.Join'ом
-----
Я понимаю что оно делает,
Я не понимаю как оно работает.
Т.е. не понимаю во что развернется выражение и как и какие параметры будут передаваться.
Пока - не понимаю. Надо копать.
Я правда сомневаюсь в эффективности этого решения
------
Решение - в указанных ограничениях - эффективно.
Остальное надо тестить, но будет не шибко плохо.
По крайней мере 30 строк с тремя циклами и пятеркой ифов - местами у меня именно так написано - эффективнее не будут.
У меня просто МНОГО кода. Любое сокращение объема - будет во благо. Даже с потерей производительности.
ну как тебе сказать...
Теоретически как-то понятно , но непонятно зачем делать так, что самому нужно вначале разобраться.
И зачем массив массивов, когда "удобнее" массив в цикле. Скобки специально для тебя
"удобнее"
------
Удобнее - бывает разное.
Мне сейчас удобнее - ужать размер кода, даже если Я чуток потеряю в производительности и малехо в читабельности/понимабельности.
Просто слишком много кода.
А понимабельность - придет со временем. Все одно эту часть придется доучивать. Еще и шаблоны в очереди...
Вот подвсплыло еще немного 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 итератора не должен менятся в процессе - разумеется тоже.
Снова споткнулся об гения билли...
Задача - та же - собрать список с разделителями.
Измемения - одна часть списка уже собрана. Источник первой части уже не доступен.
Ограничения - собранная часть может быть нулл или емпти.
Стринг.Йон нас нуллах просто обломается, для пустой строки - добавит ненужный сепаратор.
Облом - надо пересраивать логику построения...
Хватит ли Униона для решения проблемы?
не хватит?
-----
Нее, не хватит...
Униона - голого - тожА не хватило - пришлось заворачивать в массив...