Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Поиск в ObservableCollection


Автор: dAlex 15.12.2010, 11:37
Что-то никак не соображу, как пользоваться Where. У меня есть коллекция с несколькими полями, мне нужно найти тот элемент, в котором первое поле равно данному;
Код

public class StrikeData
        {
            public int Strike { get; set; }
            ....
            public int PosBuy { get; set; }
            public int PosSell { get; set; }
        }
ObservableCollection<StrikeData> _StrikeCollection = new ObservableCollection<StrikeData>()


поиск нужен по Strike;

Почитала http://msdn.microsoft.com/en-us/library/bb534803%28v=VS.95%29.aspx?appId=Dev10IDEF1&l=EN-US&k=k%28%22SYSTEM.LINQ.ENUMERABLE.WHERE%60%601%22%29;k%28WHERE%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK&k=VERSION=V3.5%22%29;k%28DevLang-CSHARP%29&rd=true, все равно не понимаю, как составлять выражение для поиска =(
нужно что-то типа этого:
Код

if(_StrikeCollection[i].Strike  == my_strike) ...

Автор: CYBERDREAM 15.12.2010, 13:56
Код

var temp = _strikeCollection.Where(it => it.Strike == 2);

||
var temp1 = from t in _strikeCollection
            where t.Strike == 2
            select t;

Автор: dAlex 15.12.2010, 14:04
CYBERDREAM, понятно, спасибо =)
а как оттуда взять номер it в _strikeCollection? получается тип System.Linq.Enumerable.WhereEnumerableIterator

Автор: CYBERDREAM 15.12.2010, 14:09
it в данном случае представляет собой экземпляр StrikeData, надо же как то обращаться к свойству его.

Добавлено через 25 секунд
покопай в сторону лямбда выражений - от туда ноги растут

Автор: dAlex 15.12.2010, 14:16
почитаю, спасибо =)
пока сделала тупо
Код

for (i = 0; i < _StrikeCollection.Count(); i++)
                    if (_StrikeCollection[i].Strike == my_strike)
                        break;

Автор: CYBERDREAM 15.12.2010, 14:18
если нужен элемент один, который попадает под условие то

Код

StrikeData temp = _strikeCollection.Where(it => it.Strike == 2).FirstOrDefault();


если не найдет, то temp==null

Автор: dAlex 15.12.2010, 15:28
CYBERDREAM, но тогда все равно номер не достать =) или потом делать IndexOf?

Автор: CYBERDREAM 15.12.2010, 15:35
Код

int index = _strikeCollection.FindIndex(it => it.Strike == 457);


Добавлено через 1 минуту и 51 секунду
либо по старинке:
Код

int i;
for (i = 0; i < _strikeCollection.Count && _strikeCollection[i].Strike != 457; i++) ;

Автор: dAlex 15.12.2010, 15:42
CYBERDREAM, нет, не в этом смысле =) нашли мы элемент, у которого Strike равен чему-то, и нужно запомнить его номер в коллекции для дальнейших извращений =)

Автор: CYBERDREAM 15.12.2010, 15:43
а я разве не это сделал?
FindIndex как раз это и делает

Автор: dAlex 16.12.2010, 10:26
CYBERDREAM, а, точно, просмотрела чего-то +)) спасибо =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)