Поиск в List<>
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 09.07.06 05:43
Оценка:
В msdn приводятся простейшие примеры типа:

   class Program
   {
      static void Main(string[] args)
      {
         List<Point> mydatalist = new List<Point>();
         mydatalist.Add(new Point(1, 2));
         mydatalist.Add(new Point(3, 4));
         mydatalist.Add(new Point(4, 6));
         mydatalist.Add(new Point(7, 8));

         foreach (Point p in mydatalist)
            Console.WriteLine(p);

         int i = mydatalist.FindIndex(Condition);

         Console.WriteLine("x == 4 в позиции index = " + i);

         Console.ReadKey();
      }

      private static bool Condition(Point p)
      {
         if (p.X == 4)
            return true;
         else
            return false;
      }
   }

т.е. с фиксированно забитым в Condition параметром условия (4).

А как делается тоже самое, только с параметром, который становится известен непосредственно перед FindIndex():

int finded_X = 4;
int i = mydatalist.FindIndex(?????);
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Поиск в List<>
От: retalik www.airbandits.com/
Дата: 09.07.06 05:56
Оценка: 33 (1)
Здравствуйте, Odi$$ey, Вы писали:

OE>А как делается тоже самое, только с параметром, который становится известен непосредственно перед FindIndex():


Все скучно... Нужно создать класс Condition, который будет хранить состояние — искомый индекс. И его метод можно передать туда в качестве делегата.

К счастью, во втором дотнете это будет сделано автоматически, если юзать сахар с лямбдами:

int finded_X = 4;
int i = mydatalist.FindIndex(delegate(Point p){ return p.X == finded_X; });
Успехов,
Виталий.
Поиск в List<>
От: desco США http://v2matveev.blogspot.com
Дата: 09.07.06 06:54
Оценка: 38 (2)
#Имя: FAQ.dotnet.list.search
Здравствуйте, 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);
Re[2]: Поиск в List<>
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.07.06 23:27
Оценка: +1
Здравствуйте, retalik, Вы писали:

R>
R>int finded_X = 4;
R>int i = mydatalist.FindIndex(delegate(Point p){ return p.X == finded_X; });
R>


Кстати, поубивать бы за такой синтаксис. И что им помешало в 2.0 ввести лямбы?
int finded_X = 4;
int i = mydatalist.FindIndex(point => point.X == finded_X);

Ведь куда читабелнее.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Поиск в List<>
От: Lloyd Россия  
Дата: 10.07.06 00:43
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Кстати, поубивать бы за такой синтаксис. И что им помешало в 2.0 ввести лямбы?

VD>int finded_X = 4;
VD>
VD>int i = mydatalist.FindIndex(point => point.X == finded_X);
VD>

VD>Ведь куда читабелнее.

А теперь продемонстрируй твой вариант в более сложно случае, например, когда условия поиска сложнее или когда критериев совпадения — несколько.
Re[3]: Поиск в List<>
От: nikov США http://www.linkedin.com/in/nikov
Дата: 10.07.06 06:38
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Кстати, поубивать бы за такой синтаксис. И что им помешало в 2.0 ввести лямбы?


Вроде бы в 3.0 лямбды планируются
Спецификация C# 3.0
Re: Поиск в List<>
От: _FRED_ Черногория
Дата: 10.07.06 07:19
Оценка: 11 (1) +1
Здравствуйте, Odi$$ey, Вы писали:


OE>А как делается тоже самое, только с параметром, который становится известен непосредственно перед FindIndex():
OE>int finded_X = 4;
OE>int i = mydatalist.FindIndex(?????);


Ещё один вариант, который можно использовать тогда, когда алгоритм проверки condution понадобится в нескольких местах и его не захочется дублировать:
  class Program
  {
    static void Main() {
      List<Point> mydatalist = new List<Point>();
      mydatalist.Add(new Point(1, 2));
      // …
      int i = mydatalist.FindIndex(Condition(4));
    }

    private static Predicate<Point> Condition(int x) {
      return delegate(Point point) { return point.X == x; };
    }
  }
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Поиск в List<>
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.07.06 14:56
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>А теперь продемонстрируй твой вариант в более сложно случае, например, когда условия поиска сложнее или когда критериев совпадения — несколько.


А что изменится то? Все равно будет короче и понятнее.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Поиск в List<>
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.07.06 14:56
Оценка:
Здравствуйте, nikov, Вы писали:

VD>>Кстати, поубивать бы за такой синтаксис. И что им помешало в 2.0 ввести лямбы?


N>Вроде бы в 3.0 лямбды планируются

N>Спецификация C# 3.0

А я о чем говрю? Просто не ясно нафига было включать довольно убогий и неудобный синтаксис если уже в это время уыл синтаксис лямбды?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Поиск в List<>
От: Lloyd Россия  
Дата: 10.07.06 15:08
Оценка:
Здравствуйте, VladD2, Вы писали:

L>>А теперь продемонстрируй твой вариант в более сложно случае, например, когда условия поиска сложнее или когда критериев совпадения — несколько.


VD>А что изменится то? Все равно будет короче и понятнее.


А ты напиши просто. А там посмотрим, будет ли понятнее.
Re[2]: Поиск в List<>
От: Аноним  
Дата: 10.07.06 15:10
Оценка:
found_X
Re[5]: Поиск в List<>
От: Lloyd Россия  
Дата: 10.07.06 15:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А я о чем говрю? Просто не ясно нафига было включать довольно убогий и неудобный синтаксис если уже в это время уыл синтаксис лямбды?


Да только этот синтаксис лямбд весьма убог (в смысле ограничен).
Re[6]: Поиск в List<>
От: _FRED_ Черногория
Дата: 10.07.06 15:54
Оценка:
Здравствуйте, Lloyd, Вы писали:

VD>>А я о чем говрю? Просто не ясно нафига было включать довольно убогий и неудобный синтаксис если уже в это время уыл синтаксис лямбды?


L>Да только этот синтаксис лямбд весьма убог (в смысле ограничен).


Может, сам примерчик и покажешь, когда в лямбдах запись хуже получается, чем в C# 2.0?
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Поиск в List<>
От: Andy77 Ниоткуда  
Дата: 10.07.06 16:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>found_X


А по смыслу вообще valueToFind
Re[6]: Поиск в List<>
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.07.06 18:27
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>А ты напиши просто. А там посмотрим, будет ли понятнее.


Что писать, то? Ты бы изобразил пробраз на синтаксисе 2.0.

А то я как-то на Немереле в синтаксисе C# 3.0 уже много чего пишу и проблем не вижу. Может ты чё свежим взглядом рассмотрел...
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Поиск в List<>
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.07.06 18:27
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Да только этот синтаксис лямбд весьма убог (в смысле ограничен).


Ну, изложи нам свои мысли по этому поводу, а то лично я пока что не вижу из чего можно сделать такое заключение.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Поиск в List<>
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.07.06 18:27
Оценка:
Здравствуйте, _FRED_, Вы писали:

L>>Да только этот синтаксис лямбд весьма убог (в смысле ограничен).


_FR>Может, сам примерчик и покажешь, когда в лямбдах запись хуже получается, чем в C# 2.0?


Да фиг с ним с 2.0. Хотелось бы вообще пример выпячивающий "убогость и ограниченность".
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Поиск в List<>
От: Lloyd Россия  
Дата: 10.07.06 19:06
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Да фиг с ним с 2.0. Хотелось бы вообще пример выпячивающий "убогость и ограниченность".


Пардон, а разве лямбды C# 3.0 не должны быть представимы в виде expression tree? Если это не так, то посыпаю голову пеплом и признаю себя неправым.
Синтаксис лямбды и анонимных методов
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.07.06 21:10
Оценка: 55 (8)
#Имя: FAQ.dotnet.delegate.to.lambda
Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
lambda delegate
Re: Поиск в List<>
От: McSpace Россия  
Дата: 03.08.06 14:10
Оценка: 6 (1)
или уже через Linq, а именно Standard Query Operators

например Single:


int id = 4;
Point p = mydatalist.Single(p => p.x == id);
While (!Life.EOF){
You.Money ++;
You.Girls.Add(new Girl(90,60,90));
BeHappy();
}
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.