locked
Необходимо найти индекс объекта в ObservableCollection. RRS feed

  • Вопрос

  • Мне необходимо найти индекс объекта в ObservableCollection.

    Так работает:
    var postItem = App.PoseManyModel.Items.Select(x => (PoseItem)x).Where(y => y.Pose_ID.Equals(indexItem)).First();
    int idx = App.PoseManyModel.Items.IndexOf(postItem);

    А для этого не могу сделать:
    var postItem = App.PoseGroupModel.Items.SelectMany(x => (Group<string, PoseItem>)x).Where(y => y.Pose_ID.Equals(indexItem)).First();

    Подскажите, пожалуйста, реализацию int idx для нижнего кода.
    18 июня 2013 г. 17:35

Ответы

  • Так это же разные методы. В первом случае возвращается последовательность TResult (ссылки остаются неизменными), а во втором уже происхордит проекция TResult -> IEnumerable<TResult>, и уже возвращается последовательность новых элементов. Поэтому ссылка не находится во втором случае.
    19 июня 2013 г. 6:40

Все ответы

  • Добрый день!

    А если попробовать что то вроде того, как предложено здесь http://stackoverflow.com/questions/11891505/linq-using-the-index-from-a-select-many-query,

    ну и условие Where добавить тогда :
     Product p = products.Where(r => r.ID == "Eggs-Direct").First();
     int inx = p.Position;

    19 июня 2013 г. 6:11
  • Так это же разные методы. В первом случае возвращается последовательность TResult (ссылки остаются неизменными), а во втором уже происхордит проекция TResult -> IEnumerable<TResult>, и уже возвращается последовательность новых элементов. Поэтому ссылка не находится во втором случае.
    19 июня 2013 г. 6:40
  • Андрей,

    Второй раз Вас предупреждаю не отмечать как полезные свои вопросы и сообщения с твино-учеток.


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    20 июня 2013 г. 10:40
  • Поэтому ссылка не находится во втором случае.
    Не понял. Поясните, пожалуйста.
    27 июня 2013 г. 9:02
  • Приведите определения типов PoseItem, Group и тип элементов коллекции Items, чтобы было на чём показать.

    Сделаем содержимое сообщества лучше, вместе!

    27 июня 2013 г. 9:40
  • А если попробовать что то вроде того, как предложено здесь http://stackoverflow.com/questions/11891505/linq-using-the-index-from-a-select-many-query,

    ну и условие Where добавить тогда :
     Product p = products.Where(r => r.ID == "Eggs-Direct").First();
     int inx = p.Position;


    var postItem2 = App.PoseGroupModel.Items.SelectMany(x => (Group<string, PoseItem>)x).Select((item, index) => new { Itm = item, Idx = index }).Where(y => y.Idx.Equals(indexItem)).First();

    int yyy = postItem2.Idx;

    В итоге yyy должен быть равен 0 (если это первый элемент коллекции), а он равен ID записи из БД.
    27 июня 2013 г. 13:30
  • Так это же разные методы. В первом случае возвращается последовательность TResult (ссылки остаются неизменными), а во втором уже происхордит проекция TResult -> IEnumerable<TResult>, и уже возвращается последовательность новых элементов. Поэтому ссылка не находится во втором случае.

    Какой второй случай?

    1) var postItem = App.PoseManyModel.Items.Select(x => (PoseItem)x).Where(y => y.Pose_ID.Equals(indexItem)).First();
    2) var postItem = App.PoseGroupModel.Items.SelectMany(x => (Group<string, PoseItem>)x).Where(y => y.Pose_ID.Equals(indexItem)).First();

    Конечно так "int idx = App.PoseManyModel.Items.IndexOf(postItem);" в 2) не найдется. Типы переменных совершенно разные. Но если не делать SelectMany, то там нельзя использовать Pose_ID. Вот поэтому я и просил может как-то переписать второй вариант с использованием сразу и SelectMany и Select.

    27 июня 2013 г. 17:37
  • Покажите определения типов (классы) PoseItem, Group и Items.

    Сделаем содержимое сообщества лучше, вместе!

    27 июня 2013 г. 18:54
  • Покажите определения типов (классы) PoseItem, Group и Items.
    Обычная группировка для LongListSelector'а, когда IsFlatList="False". Любые свои классы можете подставить.

        public class Group<T> : ObservableCollection<T>
        {
            public Group(string name, IEnumerable<T> items)
            {
                this.Key = name;
                foreach (T item in items)
                    this.Add(item);
            }
            public override bool Equals(object obj)
            {
                Group<T> that = obj as Group<T>;
                return ((that != null) && (this.Key.Equals(that.Key)));
            }
            public string Key
            {
                get;
                set;
            }
        }

    29 июня 2013 г. 7:11