Поиск в 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();
}
Re[2]: Поиск в List<>
От: _FRED_ Черногория
Дата: 03.08.06 14:50
Оценка:
Здравствуйте, 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.
Re[3]: Поиск в List<>
От: McSpace Россия  
Дата: 03.08.06 15:07
Оценка:
Согласен!
Я не сильно вникал в условие примера.
While (!Life.EOF){
You.Money ++;
You.Girls.Add(new Girl(90,60,90));
BeHappy();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.