Pull to refresh

Comments 66

Уже кому-то пригодилось :)
У меня раньше ник Poison был, а свой компьютер по сей день так называю по старой привычке :)
Это мой ник лет уже 15 как.. :)
Отличное описание! Одно замечание, почему бы в примере удаления не поступить проще:

var tracks2Del = doc.Root.Descendants("track").Where(t => t.Element("artist").Value == "DMX");
tracks2Del.Remove();

Так нагляднее и с идеологией LINQ больше согласуется.
Да, вы правы. Я как-то попробовал сделать через Remove() у коллекции - записи не удалились, поэтому пошел другим путем.
Наверное что-то не так пробовал, сейчас все ок :)
new XElement("album", "Wide Angle"))));doc.Save(fileName);

сохранение 2 раза
Спасибо, поправил. Это я боролся с тем как лучше в хабр код вставлять..
PS. В сети столько хороших конвертеров C# to HTML, а на хабре ними и не воспользуешься.. (
В примере id у трэков почему-то совпадают.
Поправил, это был вставлен из "тестовой" версии результат по ошибке.
Хабр начинает приносить мне пользу) Спасибо, Анатолий.
Хорошая статья. Может попробовать вставлять скриншоты кода?
Будет не удобно при копировании, но зато читабельно.
Спасибо.
Не знаю, может что-нить придумаю, скриншотами неудобно будет, а читабельность действительно никакая сейчас.. Да и на форматирование всего этого много времени уходит. Несовсем удобно сделано..
Помучился я немного, но похоже код на хабр никак красиво не запостить, сильно ограничение наложено на HTML. + непонятно почему если ставишь флаг "отключить форматирование HTML", то оно все равно половину заменяет на свое усмотрение.. :(
Жаль :( ждём завтра, может на суперхабре это будет удобно :)
Не знаю всех тонкостей Хабра, но в голове крутится мысль о ссылке на исходники. Ну или внешние пэйджы с отформатированным кодом.
Но сразу же проблема — хостинг. Если в первом случае достаточно какого-нибудь ifolder'a, то во втором — сложнее.
Так тоже не совсем удобно будет, прийдется постоянно переключаться между окнами, что с мысли сбивает.
Нужно действительно до завтра подождать, вдруг что изменится в эту сторону.
Ну ссылка с исходниками и примером была мы действительно кстати.
Спасибо! Очень хотелось бы увидеть развитие темы в LINQ To SQL! :)
Подумаю над этим детальнее.
Очень познавательно :) Когда наконец большинство хабролюдей поймёт что сишарп это гут :)
Если убрать в авторском коде new перед конструкторами, то получится практически Lisp. Ждем окончательной победы функционального программирования в C# 4.0 (и Java 2.0) :)
Мне кажется существует большое количество .net разработчиков, которые читают хабр, но не понимая ничего в php, python, apache и ubuntu c linux, темах которые главенствуют на сайте, молчат в тряпочку. Конкретный пример - я. Хабр читаю, что-то около полугода. Решил зарегистрироваться только сегодня, когда увидел новый блог ".NET". Теперь, когда накоплю достаточно кармы, намерен пописывать опусы про интересные вещи в .net.
Это замечательно. А какие темы вам больше всего интересны?
На сегодня, пожалуй, asp.net в связке с javascript/css. Скоро появится MVC pattern, Data Entity Framework, .Net Data Services и станет еще интереснее.
А помимо MVC pattern'а еще и сам ASP.NET MVC Framework.
Astoria Data Services - это действительно мощная вещь.
Мне лично было бы интересно про WPF...
Практически тот же случай..
Проголосую за вашу карму. :)
Три замечания. Во-первых, в C# 3.0 есть "var". Во-вторых, — анонимные типы. И, наконец,
foreach(var track in tracks) читается лучше, нежели foreach (XElement t in tracks)
Статья ведь о том, как с XML работать, и я попытался её не перегрузить проекцией на типы, трансформацией и т.д. Именно поэтому и использовался XElement, для наглядности.
В таком случае нагляднее было бы так: foreach (XElement track in tracks)
Не совсем понял, вам не понравилось однобуквенное название переменной? Это уж на вкус и цвет. У меня циклы все на одну две строчки кода, в таких случаях абсолютно не вижу никакой необходимости писать длинные названия переменных. Если код итерации более объемный, то, безусловно, с вами соглашусь.
Не соглашусь насчет того, что var в данном контексте читается лучше. Считаю, что указание конкретного типа в foreach - это признак хороший тона хотя бы потому, что тогда контекст итераций будет самодостаточным. Разбирая в дальнейшем тело цикла не нужно будет искать определение tracks. Особенно это актуально для тяжелых циклов. Это мое личное мнение, дело вкуса. Я сам стараюсь использовать var в основном для промежуточного буфера. Например, когда LINQ-строка уже слишком длинная, но необходимо все же произвести еще какие-то действия типа ToList или Remove.
Хм. Xml в дотнете всегда меня в ступор вводит. Буду иметь в виду теперь и такой подход.

Вот теперь я понимаю, что карма на самом деле вещь полезная для самопроявления =)
Ввела в ступор дата регистрации ваша. Подумал, что из будущего — не обратил внимание на год. :)
Вообще с XML и старыми методами довольно таки неплохо работать, только более объемно как-то получалось.

PS. А карма.. не знаю.. было бы когда материал готовить.
Кстати, предлагаю вам продолжить и заделать материал про агрегацию RSS средствами LINQ to XML. С LINQ это вообще пустяковое дело.
Наверно дело в том, что в боевых условиях я полноценно с xml не работал. Сейчас использую только как хранилище алиасов для enum'ов — а там сериализация. А вот как-то с ходу написать (или по крайней мере придумать как написать) helper для xml файлов не получается.

Про будущее — сам пугаюсь в этом месяце =)

А про карму: поделиться про логирование в экстэншенах хочется. =)
Сбило с толку не подключенная System.Linq в начале кода.
Пожалуйста, явно указывайте новые пространства имён, а то я с 3.5 фреймворком только начинаю разбираться :).
А в какой среде вы разбираетесь? 2008 студия при указании .net 3.5 сама создает проект с подключенным неймспейсом System.Linq.
2008, тольк неймспейсы которые мне не нужны я удаляю по привычке :)
Кстати, по теме: в студии есть прикольная фича "Sort and Remove", я ей пользуюсь, когда страница приобретает законченные очертания.
Если вы создали консольное приложение под 3.5 фреймворк, то это просторанство имен подключено по умолчанию. Впредь буду указывать все что имеется.
Да, 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>


Вызов метода = создание элемента, параметры метода = атрибуты.
Да, сейчас в эту сторону активно все движется. В VB вообще XML поддерживается прямо из кода. Чем-то это программирование напомнило старый добырй ASP, только наоборот :)
UFO landed and left these words here
Уже готовлю материал по LINQ to SQL ;) Не знаю правда насколько меня хватит во время рабочей недели, но радует, что грядут выходные снова :)

У меня тоже старые проекты под 2.0. В общем-то ничего, живут потихоньку, и я вместе с ними. В 2.0 очень жизнь облегчает по работе с данными Enterprice Library Data Application Block. Очень советую, если ещё не пользуетесь.
Что-то я только тут и делаю, что с вами спорю.

DAB — это, простите, жуть и тот факт, что он входит во "фреймворк" в названии которого фигурирует магическое "Enterprise", лучше его не делает. Посмотрите лучше в сторону NHibernate/BLToolkit.
Да нестрашно :)
Мое мнение ведь не единственно правильное.

Вообще я DAAB изначально начал использовать как только перешел от ручного кодирования, мои задачи эта библиотека выполняла вполне нормально. Насколько я понял предложенные вами - это ORM решения, а это для меня было немного с избытком. У DAAB и NHibernate, на мой взгляд, немного разные сферы применения изначально.
BLToolkit — это не ORM, а просто маппер из всего во всё (в том числе и в/из DataSet'ов и DataTable'ов). Удобнее DAAB'а на несколько порядков.
BLToolkit может, а NHibernate — ORM.
Возможно мне не повезло, что оно мне первым не попалось. Говорю без иронии. Просто все время разбираться с новыми библиотеками тоже не правильно. По NHibernate в свое время не нашел какой-то хорошей статьи с обзором возможностей, в общем не зацепило тогда когда смотрел.

Не хотите написать краткий обзор? :) Я думаю тема интересна многим будет.
Посмотрите на IdeaBlade DevForce, http://ideablade.com/.
Отлично докумментированный фреймворк. Их ORM показался мне очень удобным
Спасибо большое, посмотрю, но, думаю, уже .NET стал более самодостаточным. Буду пробовать обходиться "своими" силами в последующий проектах.
А почему приходится???
Уж что что, а .NET-то обновляется вообще запросто! И он обратно совместим.
UFO landed and left these words here
Воо, здорово! LINQ - это однозначно будущее .NET. Спасибо за статью, я надеюсь многих .NET-чиков, которые еще не пользуются, заставит задуматься о том, что стоит попробовать LINQ ;)
Можно еще удалить все записи и в функциональном стиле: :-)
<pre>
doc.Root.Descendants ( "track" ).Where (
t => t.Element("artist").Value == "DMX").ToList ( ).ForEach (
t => t.Remove ( ) );
<pre></code>
Ну для удаления это уже совсем жестоко :)
А можно узнать как использовать свою функцию сравнения двух элементов в сортировке?(только попроще - только начинаю изучать XML и LINQ)
В работе как-то не приходилось писать такое, но для сортировки треков по длине названия получилось следующее:
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 корректно не работает, и хабр че-то начал теги жевать. Думаю вы разберетесь что к чему ;)
Спасибо, изложил очень доступно; респект за статьи, побольше таких! :)
Спасибо за отзыв :)
Ещё пару тем есть, которые хотел бы осветить, но нету времени совсем.. Как появится, так сразу продолжу что-то писать.
Образцовый туториал. Спасибо большое, Анатолий! Надо было мне сначал гуглить на русском… какая редкость))
Наконец-то нормальная статья! Давно такое искал!
Only those users with full accounts are able to leave comments. Log in, please.