Собрать список?
Пятничная задачка - Собрать список?
Дано:
Табличка 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 не пользуется успехом? Проклянут тебя последователи.
Это - да, ничего не мешает.
Только вот в условиях задачки указано требование - не использовать foreach (добавлю - while, for, do, ForEach), а делать исключительно LINQом.
Просто группировка по полю - это без проблем, а вот по количеству - пока не понятно...
И какой тебе Sort нужен?
мне никакой не нужен, он нужен тебе. Мне просто интересно было узнать от чего тебе понравился селект, а не сорт - от меньшего количества букв?
Уупс, сорт тебе тоже не нужен ... сбил ты меня OrderNo
Может строку кода?
одну - нету
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 */
А вообще странные у тебя словия и задачи
-----
Чем странны мои пятничные задачки?
Тем, что заставляют/позволяют взглянуть на вполне традиционные исходные данные и решение и, потом, подумать над несколько нестандартным решением в непонятных ограничениях?
Ну так это пятничная задачка - возможность пошевелить мозгой, поупражнятся в извращениях, по-ошибаться и предложить что-то малоизвестное в качестве решения. И в результате - научится чему-то.
Решение, кстати, мне понравилось. Компактностью. Именно то, что хотел.
Осталась, у меня, проблема - понять как оно работает. Ну да это моя проблема - куда рыть уже примерно понятно, осталось - рыть.
Осталась, у меня, проблема - понять как оно работает.
Группирует по индексу и далее формирует строку 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 итератора не должен менятся в процессе - разумеется тоже.
Снова споткнулся об гения билли...
Задача - та же - собрать список с разделителями.
Измемения - одна часть списка уже собрана. Источник первой части уже не доступен.
Ограничения - собранная часть может быть нулл или емпти.
Стринг.Йон нас нуллах просто обломается, для пустой строки - добавит ненужный сепаратор.
Облом - надо пересраивать логику построения...
Хватит ли Униона для решения проблемы?