Аннотация:
С выходом третьей версии C# появляется новая сущность — LINQ (Language Integrated Query) и данная статья посвящена как раз описанию места, которое занимает LINQ во всей дотнетной кухне, что во что integrated и как этим можно пользоваться...
IB>Авторы: IB> Ivan Bodyagin
IB>Аннотация: IB>С выходом третьей версии C# появляется новая сущность — LINQ (Language Integrated Query) и данная статья посвящена как раз описанию места, которое занимает LINQ во всей дотнетной кухне, что во что integrated и как этим можно пользоваться...
Статья хорошая, но в определении AnonymousClass2 допущены ошибки — generic parameters TA и TB не описаны и имя конструктора не совпадает с именем класса.
Дожно быть как-то так:
public class AnonymousClass2<TA, TB>
{
readonly TA _A;
public TA A
{
get { return _A; }
}
readonly TB _B;
public TB B
{
get { return _B; }
}
public AnonymousClass2(TA A, TB B)
{
_A = A;
_B = B;
}
}
Здравствуйте, V.Petrovski, Вы писали:
VP>Статья очень хорошая для ознакомления с C# 3.0 и LINQ,
спасибо.
VP>но вот здесь ошибка:
Этот код вообще в ворде писался, поэтому не удивительно.. )
Здравствуйте, Ivan Bodyagin, Вы писали:
Расширяющие методы
Выход придумали следующий (точнее, позаимствовали из следующего стандарта C++, который так, похоже, и не появится на свет до выхода C# 3.0 – прим.ред.)
Вообщето расширяющие методы (helper) существовали уже давно в Delphi.Net (увидевшего свет вместе с Net 1.1). И там это была необходимость для более легкого переноса нативного кода, дополняя (расширяя) классы нативными методами. Так что если это и сахар то весьмя эффективный.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Вообщето расширяющие методы (helper) существовали уже давно в Delphi.Net (увидевшего свет вместе с Net 1.1). И там это была необходимость для более легкого переноса нативного кода, дополняя (расширяя) классы нативными методами. Так что если это и сахар то весьмя эффективный.
В Дельфи они тоже были не первыми. Реально первоисточником (надеюсь, я не ошибаюсь) является еще не принятый стандарт C++ 0x. Там эта идея еще в году в 2002-ом была пожалуй.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
На мой взгляд название не несоответствует. В статье в основном говорится о расширениях в C#, а вот тема ЛИНК-а затронута только вскользь. Надеюсь, Иван таки напишет нам еще одну статейку где он расскажет об оставшихся нераскрытыми темах.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>В Дельфи они тоже были не первыми. Реально первоисточником (надеюсь, я не ошибаюсь) является еще не принятый стандарт C++ 0x. Там эта идея еще в году в 2002-ом была пожалуй.
Первыми, что касается Net.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, VladD2, Вы писали:
VD>На мой взгляд название не несоответствует. В статье в основном говорится о расширениях в C#, а вот тема ЛИНК-а затронута только вскользь.
Не, название как раз соответствует... =)
Просто про LINQ статей и блогов написано вагон, а хотелось показать на чем LINQ основан и что эти расширения по сути и есть LINQ. Что, с одной стороны, LINQ определил реализацию этих расширений, а с другой — без этих расширений не получился бы никакой LINQ.
Если же продолжать, то наверное имеет смысл написать о применении LINQ-а в быту..
Здравствуйте, VladD2, Вы писали:
VD>В Дельфи они тоже были не первыми. Реально первоисточником (надеюсь, я не ошибаюсь) является еще не принятый стандарт C++ 0x. Там эта идея еще в году в 2002-ом была пожалуй.
Ну судя по статье и дате выхода Delphi 7 это утверждение можно оспорить. В людом случае для Delphi они были более необходимы, впрочем как уже их сейчас хорошо прикручивают для лямбд (например http://www.rsdn.ru/article/dotnet/cslambda.xml#ETMAC
Здравствуйте, IB, Вы писали:
IB>Не, название как раз соответствует... =) IB>Просто про LINQ статей и блогов написано вагон, а хотелось показать на чем LINQ основан и что эти расширения по сути и есть LINQ. Что, с одной стороны, LINQ определил реализацию этих расширений, а с другой — без этих расширений не получился бы никакой LINQ.
Из названия это понять практически невозможно. Когда читаешь название, то думаешь, что статья будет о новой версии Шарпаа и о ЛИНК-е.
IB>Если же продолжать, то наверное имеет смысл написать о применении LINQ-а в быту..
Я бы предпочел по началу детальную статью о том как устроен LINQ to SQL, а уже потом как его в быту применять.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Serginio1, Вы писали:
S>Ну судя по статье и дате выхода Delphi 7 это утверждение можно оспорить.
Имелась ввиду статья http://www.rsdn.ru/article/?177
Здравствуйте, VladD2, Вы писали:
VD> Когда читаешь название, то думаешь, что статья будет о новой версии Шарпаа и о ЛИНК-е.
Ну дык, она именно об этом... =)
VD>Я бы предпочел по началу детальную статью о том как устроен LINQ to SQL, а уже потом как его в быту применять.
Не, Linq to SQL — это отдельная тема, сначала надо просто про LINQ в быту, а потом уже про SQL и прочие окружающие приседания.. )
По поводу анонимных типов — они вполне выходят за границу методов:
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
namespace an {
class Program {
static Dictionary<object, string> dict = new Dictionary<object, string>();
public static void Main(string[] args) {
// TODO: Implement Functionality Here
Add();
Get();
}
public static void Add() {
dict.Add(new {x=5, y=6}, "test");
}
public static void Get(){
Console.WriteLine(dict[new{x=5, y=6}]);
}
}
}
Естественно, обратиться к полям класса вне метода нельзя, потому как компилятор не знает типа. Но пользоваться вот такими вот конструкциями для сравнений очень удобно.
А>По поводу анонимных типов — они вполне выходят за границу методов: А>
А>using System;
А>using System.Text;
А>using System.Collections.Generic;
А>using System.Linq;
А>namespace an {
А> class Program {
А> static Dictionary<object, string> dict = new Dictionary<object, string>();
А> public static void Main(string[] args) {
А> // TODO: Implement Functionality Here
А> Add();
А> Get();
А> }
А> public static void Add() {
А> dict.Add(new {x=5, y=6}, "test");
А> }
А> public static void Get(){
А> Console.WriteLine(dict[new{x=5, y=6}]);
А> }
А> }
А>}
А>
А>Естественно, обратиться к полям класса вне метода нельзя, потому как компилятор не знает типа. Но пользоваться вот такими вот конструкциями для сравнений очень удобно.
ну только при условии, что методы, создающие экземпляр и использующие его находятся в одной сборке
Lib
public static class Factory
{
public static Dictionary<object, object> Create()
{
return new Dictionary<object, object> {{new {x = "a", y = 10}, ""}};
}
}
App
class Program
{
public static Dictionary<object, object> Create()
{
return new Dictionary<object, object> { { new { x = "a", y = 10 }, "" } };
}
static bool Run(Func<Dictionary<object, object>> f)
{
var key = new {x = "a", y = 10};
var dict = f();
return dict.ContainsKey(key);
}
static void Main(string[] args)
{
Console.WriteLine(Run(Create));
Console.WriteLine(Run(Factory.Create));
}
}
Здравствуйте, Аноним, Вы писали:
А>По поводу анонимных типов — они вполне выходят за границу методов:
Ну как... Если поместить в какой-нибудь другой объект, то таки да — выходят.
Называется этот фокус "cast by example", можно даже этюд в стиле nikov-а изобразить:
public class Holder
{
private object _t;
public void Store<T>(T t)
{
_t = t;
}
public T Get<T>(T t)
{
return (T)_t;
}
}
class Program
{
static void Main(string[] args)
{
var holder = new Holder();
holder.Store(new {a = 1, b = "str 1" });
var result = holder.Get(new { a = 2, b = "str 2" });
Console.WriteLine(result.a);
Console.WriteLine(result.b);
}
}
Угадай, что на консоли будет?
А> Естественно, обратиться к полям класса вне метода нельзя, потому как компилятор не знает типа.
Как видишь можно, было бы желание..
А> Но пользоваться вот такими вот конструкциями для сравнений очень удобно.
Как совершенно справедливо было замечено, не очень, потому как только в пределах одной сборки живет.
Ну и возвращаясь к сути вопроса — я не уверен, что помещение анонимного типа внутрь object-а или обобщенного типа и протаскивание его в таком виде означает, что "анонимный тип выходит за границу методов". Это не анонимный тип выходит, это его "супертип" выходит, и то, как видно, не далеко.