Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, McSpace, Вы писали:
MS>или уже через Linq, а именно Standard Query Operators
MS>например Single:
MS>int id = 4;
MS>Point p = mydatalist.Single(p => p.x == id);
Нет, как раз Single и не подойдёт — она пробегает последовательность до конца и возвращает единственное значение. Если ничего не найдено или найдено больше одного, то будет исключение.
До первого вхождения ищет First или FirstOrDefault.
Help will always be given at Hogwarts to those who ask for it.