Здравствуйте, Odi$$ey, Вы писали:
OE>А как делается тоже самое, только с параметром, который становится известен непосредственно перед FindIndex():
вариант 1.
List<Point> mydatalist = new List<Point>();
...
int xToFind = 4;
int i = myDataList.FindIndex(delegate(Point pt) { return pt.X == xToFind;});
вариант 2.
class XSearcher
{
private int x;
public XSearcher(int x)
{
this.x = x;
}
public int X
{
get {return x;}
set {x = value; }
}
public bool Condition(Point pt)
{
return pt.X == x;
}
}
....
List<Point> mydatalist = new List<Point>();
...
int xToFind = 4;
int i = myDataList.FindIndex(new XSearcher(xToFind).Condition);
Здравствуйте, Lloyd, Вы писали:
L>А теперь продемонстрируй твой вариант в более сложно случае, например, когда условия поиска сложнее или когда критериев совпадения — несколько.
А что изменится то? Все равно будет короче и понятнее.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, nikov, Вы писали:
VD>>Кстати, поубивать бы за такой синтаксис. И что им помешало в 2.0 ввести лямбы?
N>Вроде бы в 3.0 лямбды планируются N>Спецификация C# 3.0
А я о чем говрю? Просто не ясно нафига было включать довольно убогий и неудобный синтаксис если уже в это время уыл синтаксис лямбды?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
L>>А теперь продемонстрируй твой вариант в более сложно случае, например, когда условия поиска сложнее или когда критериев совпадения — несколько.
VD>А что изменится то? Все равно будет короче и понятнее.
А ты напиши просто. А там посмотрим, будет ли понятнее.
Здравствуйте, VladD2, Вы писали:
VD>А я о чем говрю? Просто не ясно нафига было включать довольно убогий и неудобный синтаксис если уже в это время уыл синтаксис лямбды?
Да только этот синтаксис лямбд весьма убог (в смысле ограничен).
Здравствуйте, Lloyd, Вы писали:
VD>>А я о чем говрю? Просто не ясно нафига было включать довольно убогий и неудобный синтаксис если уже в это время уыл синтаксис лямбды?
L>Да только этот синтаксис лямбд весьма убог (в смысле ограничен).
Может, сам примерчик и покажешь, когда в лямбдах запись хуже получается, чем в C# 2.0?
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
L>>Да только этот синтаксис лямбд весьма убог (в смысле ограничен).
_FR>Может, сам примерчик и покажешь, когда в лямбдах запись хуже получается, чем в C# 2.0?
Да фиг с ним с 2.0. Хотелось бы вообще пример выпячивающий "убогость и ограниченность".
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, VladD2, Вы писали:
VD>>Да фиг с ним с 2.0. Хотелось бы вообще пример выпячивающий "убогость и ограниченность".
L>Пардон, а разве лямбды C# 3.0 не должны быть представимы в виде expression tree? Если это не так, то посыпаю голову пеплом и признаю себя неправым.
Должна, но не обязана. Лябда в общем-то ни что иное как упрощенный синтаксис для тех самых анонимных методов. Просто было сделано несколько расширений:
1. Выбросили ключевое слово delegat и позволили не обрамлять скобками параметры если их число равно еденице.
2. Позволили, если анонимный метод содержит единственное выражение (expression, т.е. не содержит statment-во, ну, if, switch, for...) записывать его в укороченной форме, без ключевого слова return и обрамляющего блока (фигурных скобок).
3. Позволили опускать типы параметров в случаях когда их можно вывести из контекста использования (обычно из анализа содержимого люмбды или описания делегата в который помещается ссылка на лямду).
4. Ввели соглашение по которому если лямбда-функция присваевается не делегату, а специальному (захардкоженному) системному типу, то вместо кода компилятор генерирует то самое дерево выражения. Это нужно чтобы иметь возможность получить код не в виде МСИЛ-а, а в виде AST (зачем они назвали это дело деревом выражения я не знаю, маркетологи, блин) пригодного для программного анализа и сереализации (например, для передачи по сети).
Собественно все. В остальном это те же анонимные методы. Почти уверен, что к релизу анонимные методы можно будет использовать в контексте лямбд (например, при присвоении дереву выражения). Если это не будет сделано, то это будет еще один косяк.
Вот пример постепенного преобразования анонимного метода в аналогичную лямбду:
delegate(Point p){ return p.X == finded_X; } // Исходный анонимный метод
(Point p) => { return p.X == finded_X; } // Убираем ключевое слово delegate заменяя его на синтаксис лямбды "=>"(p) => { return p.X == finded_X; } // Убираем явное указание типа параметра надеясь на то, что он будет вычеслин из использования лямбды
p => { return p.X == finded_X; }// Убираем необязательные для лямбд с одним параметром скобки (строго говоря только такие функции и могут называться лямбдами)
p => p.X == finded_X // Убираем "процедурный" синтаксис заменяя его на синтаксис выражений.
Жирным выделены фрагменты синтаксиса устраняемые на следующем шаге.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.