Comments 66
познавательно)
0
Спасибо!
Будем почитать. :)
Будем почитать. :)
0
Отличное описание! Одно замечание, почему бы в примере удаления не поступить проще:
var tracks2Del = doc.Root.Descendants("track").Where(t => t.Element("artist").Value == "DMX");
tracks2Del.Remove();
Так нагляднее и с идеологией LINQ больше согласуется.
var tracks2Del = doc.Root.Descendants("track").Where(t => t.Element("artist").Value == "DMX");
tracks2Del.Remove();
Так нагляднее и с идеологией LINQ больше согласуется.
+1
new XElement("album", "Wide Angle"))));doc.Save(fileName);
сохранение 2 раза
сохранение 2 раза
0
В примере id у трэков почему-то совпадают.
0
Хабр начинает приносить мне пользу) Спасибо, Анатолий.
0
Хорошая статья. Может попробовать вставлять скриншоты кода?
Будет не удобно при копировании, но зато читабельно.
Будет не удобно при копировании, но зато читабельно.
0
Спасибо.
Не знаю, может что-нить придумаю, скриншотами неудобно будет, а читабельность действительно никакая сейчас.. Да и на форматирование всего этого много времени уходит. Несовсем удобно сделано..
Не знаю, может что-нить придумаю, скриншотами неудобно будет, а читабельность действительно никакая сейчас.. Да и на форматирование всего этого много времени уходит. Несовсем удобно сделано..
0
Помучился я немного, но похоже код на хабр никак красиво не запостить, сильно ограничение наложено на HTML. + непонятно почему если ставишь флаг "отключить форматирование HTML", то оно все равно половину заменяет на свое усмотрение.. :(
0
Жаль :( ждём завтра, может на суперхабре это будет удобно :)
0
Спасибо! Очень хотелось бы увидеть развитие темы в LINQ To SQL! :)
0
Очень познавательно :) Когда наконец большинство хабролюдей поймёт что сишарп это гут :)
+3
Если убрать в авторском коде new перед конструкторами, то получится практически Lisp. Ждем окончательной победы функционального программирования в C# 4.0 (и Java 2.0) :)
0
Мне кажется существует большое количество .net разработчиков, которые читают хабр, но не понимая ничего в php, python, apache и ubuntu c linux, темах которые главенствуют на сайте, молчат в тряпочку. Конкретный пример - я. Хабр читаю, что-то около полугода. Решил зарегистрироваться только сегодня, когда увидел новый блог ".NET". Теперь, когда накоплю достаточно кармы, намерен пописывать опусы про интересные вещи в .net.
+2
Это замечательно. А какие темы вам больше всего интересны?
0
На сегодня, пожалуй, asp.net в связке с javascript/css. Скоро появится MVC pattern, Data Entity Framework, .Net Data Services и станет еще интереснее.
0
Мне лично было бы интересно про WPF...
0
Практически тот же случай..
Проголосую за вашу карму. :)
Проголосую за вашу карму. :)
0
Три замечания. Во-первых, в C# 3.0 есть "var". Во-вторых, анонимные типы. И, наконец,
foreach(var track in tracks)
читается лучше, нежели foreach (XElement t in tracks)
0
Статья ведь о том, как с XML работать, и я попытался её не перегрузить проекцией на типы, трансформацией и т.д. Именно поэтому и использовался XElement, для наглядности.
0
В таком случае нагляднее было бы так:
foreach (XElement track in tracks)
0
Не соглашусь насчет того, что var в данном контексте читается лучше. Считаю, что указание конкретного типа в foreach - это признак хороший тона хотя бы потому, что тогда контекст итераций будет самодостаточным. Разбирая в дальнейшем тело цикла не нужно будет искать определение tracks. Особенно это актуально для тяжелых циклов. Это мое личное мнение, дело вкуса. Я сам стараюсь использовать var в основном для промежуточного буфера. Например, когда LINQ-строка уже слишком длинная, но необходимо все же произвести еще какие-то действия типа ToList или Remove.
0
Хм. Xml в дотнете всегда меня в ступор вводит. Буду иметь в виду теперь и такой подход.
Вот теперь я понимаю, что карма на самом деле вещь полезная для самопроявления =)
Вот теперь я понимаю, что карма на самом деле вещь полезная для самопроявления =)
0
Ввела в ступор дата регистрации ваша. Подумал, что из будущего не обратил внимание на год. :)
Вообще с XML и старыми методами довольно таки неплохо работать, только более объемно как-то получалось.
PS. А карма.. не знаю.. было бы когда материал готовить.
Вообще с XML и старыми методами довольно таки неплохо работать, только более объемно как-то получалось.
PS. А карма.. не знаю.. было бы когда материал готовить.
0
Кстати, предлагаю вам продолжить и заделать материал про агрегацию RSS средствами LINQ to XML. С LINQ это вообще пустяковое дело.
0
Наверно дело в том, что в боевых условиях я полноценно с xml не работал. Сейчас использую только как хранилище алиасов для enum'ов а там сериализация. А вот как-то с ходу написать (или по крайней мере придумать как написать) helper для xml файлов не получается.
Про будущее сам пугаюсь в этом месяце =)
А про карму: поделиться про логирование в экстэншенах хочется. =)
Про будущее сам пугаюсь в этом месяце =)
А про карму: поделиться про логирование в экстэншенах хочется. =)
0
Сбило с толку не подключенная System.Linq в начале кода.
Пожалуйста, явно указывайте новые пространства имён, а то я с 3.5 фреймворком только начинаю разбираться :).
Пожалуйста, явно указывайте новые пространства имён, а то я с 3.5 фреймворком только начинаю разбираться :).
0
Да, C# неплохо развивается. Для любознательных: в динамических языках можно создать XML ИМХО ещё проще и красивее. Например в Groovy с помощью builders (прошу прощения за некрасивый вид - code не работает):
writer = new StringWriter()
builder = new groovy.xml.MarkupBuilder(writer)
invoices = builder.invoices {
for(day in 1..3) {
invoice(date: new Date(106,0,day)){
item(count:day){
product(name:'ULC', dollar:1499)
}
}
}
}
На выходе получаем:
<invoices>
<invoice date='Sun Jan 01 00:00:00 CET 2006'>
<item count='1'>
<product name='ULC' dollar='1499' />
</item>
</invoice>
<invoice date='Mon Jan 02 00:00:00 CET 2006'>
<item count='2'>
<product name='ULC' dollar='1499' />
</item>
</invoice>
<invoice date='Tue Jan 03 00:00:00 CET 2006'>
<item count='3'>
<product name='ULC' dollar='1499' />
</item>
</invoice>
</invoices>
Вызов метода = создание элемента, параметры метода = атрибуты.
writer = new StringWriter()
builder = new groovy.xml.MarkupBuilder(writer)
invoices = builder.invoices {
for(day in 1..3) {
invoice(date: new Date(106,0,day)){
item(count:day){
product(name:'ULC', dollar:1499)
}
}
}
}
На выходе получаем:
<invoices>
<invoice date='Sun Jan 01 00:00:00 CET 2006'>
<item count='1'>
<product name='ULC' dollar='1499' />
</item>
</invoice>
<invoice date='Mon Jan 02 00:00:00 CET 2006'>
<item count='2'>
<product name='ULC' dollar='1499' />
</item>
</invoice>
<invoice date='Tue Jan 03 00:00:00 CET 2006'>
<item count='3'>
<product name='ULC' dollar='1499' />
</item>
</invoice>
</invoices>
Вызов метода = создание элемента, параметры метода = атрибуты.
0
Спасибо, отличная статья
0
UFO just landed and posted this here
Уже готовлю материал по LINQ to SQL ;) Не знаю правда насколько меня хватит во время рабочей недели, но радует, что грядут выходные снова :)
У меня тоже старые проекты под 2.0. В общем-то ничего, живут потихоньку, и я вместе с ними. В 2.0 очень жизнь облегчает по работе с данными Enterprice Library Data Application Block. Очень советую, если ещё не пользуетесь.
У меня тоже старые проекты под 2.0. В общем-то ничего, живут потихоньку, и я вместе с ними. В 2.0 очень жизнь облегчает по работе с данными Enterprice Library Data Application Block. Очень советую, если ещё не пользуетесь.
0
Что-то я только тут и делаю, что с вами спорю.
DAB это, простите, жуть и тот факт, что он входит во "фреймворк" в названии которого фигурирует магическое "Enterprise", лучше его не делает. Посмотрите лучше в сторону NHibernate/BLToolkit.
DAB это, простите, жуть и тот факт, что он входит во "фреймворк" в названии которого фигурирует магическое "Enterprise", лучше его не делает. Посмотрите лучше в сторону NHibernate/BLToolkit.
+1
Да нестрашно :)
Мое мнение ведь не единственно правильное.
Вообще я DAAB изначально начал использовать как только перешел от ручного кодирования, мои задачи эта библиотека выполняла вполне нормально. Насколько я понял предложенные вами - это ORM решения, а это для меня было немного с избытком. У DAAB и NHibernate, на мой взгляд, немного разные сферы применения изначально.
Мое мнение ведь не единственно правильное.
Вообще я DAAB изначально начал использовать как только перешел от ручного кодирования, мои задачи эта библиотека выполняла вполне нормально. Насколько я понял предложенные вами - это ORM решения, а это для меня было немного с избытком. У DAAB и NHibernate, на мой взгляд, немного разные сферы применения изначально.
0
BLToolkit это не ORM, а просто маппер из всего во всё (в том числе и в/из DataSet'ов и DataTable'ов). Удобнее DAAB'а на несколько порядков.
0
BLToolkit может, а NHibernate ORM.
Возможно мне не повезло, что оно мне первым не попалось. Говорю без иронии. Просто все время разбираться с новыми библиотеками тоже не правильно. По NHibernate в свое время не нашел какой-то хорошей статьи с обзором возможностей, в общем не зацепило тогда когда смотрел.
Не хотите написать краткий обзор? :) Я думаю тема интересна многим будет.
Возможно мне не повезло, что оно мне первым не попалось. Говорю без иронии. Просто все время разбираться с новыми библиотеками тоже не правильно. По NHibernate в свое время не нашел какой-то хорошей статьи с обзором возможностей, в общем не зацепило тогда когда смотрел.
Не хотите написать краткий обзор? :) Я думаю тема интересна многим будет.
0
А почему приходится???
Уж что что, а .NET-то обновляется вообще запросто! И он обратно совместим.
Уж что что, а .NET-то обновляется вообще запросто! И он обратно совместим.
0
Воо, здорово! LINQ - это однозначно будущее .NET. Спасибо за статью, я надеюсь многих .NET-чиков, которые еще не пользуются, заставит задуматься о том, что стоит попробовать LINQ ;)
0
Можно еще удалить все записи и в функциональном стиле: :-)
<pre>
doc.Root.Descendants ( "track" ).Where (
t => t.Element("artist").Value == "DMX").ToList ( ).ForEach (
t => t.Remove ( ) );
<pre></code>
<pre>
doc.Root.Descendants ( "track" ).Where (
t => t.Element("artist").Value == "DMX").ToList ( ).ForEach (
t => t.Remove ( ) );
<pre></code>
0
А можно узнать как использовать свою функцию сравнения двух элементов в сортировке?(только попроще - только начинаю изучать XML и LINQ)
0
В работе как-то не приходилось писать такое, но для сортировки треков по длине названия получилось следующее:
1. Нужно создать свой класс, реализующий интерфейс IComparer<>:
class MyComparer<T> : IComparer<string>
{
public int Compare(string x, string y)
{
return x.Length.CompareTo(y.Length);
}
}
2. Отсортировать треки, используя наш компарер:
var tracks = doc.Root.Elements("track").OrderBy(x => x.Element("name").Value, new MyComparer<string>());
Первым параметров в OrderBy передаем, используя лямбда выражения, то, по чему мы хотим отсортировать наши записи. Вторым - экземпляр класса MyComparer, который мы только что описали.
Уж сори, что пишу код простым текстом, но ни poison.qsh.ru корректно не работает, и хабр че-то начал теги жевать. Думаю вы разберетесь что к чему ;)
1. Нужно создать свой класс, реализующий интерфейс IComparer<>:
class MyComparer<T> : IComparer<string>
{
public int Compare(string x, string y)
{
return x.Length.CompareTo(y.Length);
}
}
2. Отсортировать треки, используя наш компарер:
var tracks = doc.Root.Elements("track").OrderBy(x => x.Element("name").Value, new MyComparer<string>());
Первым параметров в OrderBy передаем, используя лямбда выражения, то, по чему мы хотим отсортировать наши записи. Вторым - экземпляр класса MyComparer, который мы только что описали.
Уж сори, что пишу код простым текстом, но ни poison.qsh.ru корректно не работает, и хабр че-то начал теги жевать. Думаю вы разберетесь что к чему ;)
0
В избранное!
0
Образцовый туториал. Спасибо большое, Анатолий! Надо было мне сначал гуглить на русском… какая редкость))
0
Наконец-то нормальная статья! Давно такое искал!
0
Only those users with full accounts are able to leave comments. Log in, please.
Работаем с LINQ to XML