Как получить номер элемента в linq?

114
15 декабря 2021, 17:50

У меня есть список объектов linq Объект:

{id, count}

Они расположены по возрастанию count, как я могу получить номер объекта в этом списке по id?

List<Route> routes = _applicationDbContext.Routes.OrderBy(a =>a.count).ToList();
  • Список отсортирован (что из себя представляет объект чуть выше)
  • Нужно получить порядковый номер объекта по id
  • Ответ это число, порядковый номер элемента

Как это можно сделать?

Answer 1

Если я правильно понял, то вам нужен "индекс", так? Если да, то для этого у List<> есть такие методы, как IndexOf() или вовсе FindIndex(), которые сделают за вас все необходимое.

К примеру у нас есть такой класс:

class Item
{
    public Item(int id, int count)
    {
        Id = id;
        Count = count;
    }
    public int Id { get; set; }
    public int Count { get; set; }
}

Мы делаем коллекцию:

var testList = new List<Item>
{
    new Item(1002, 55),
    new Item(1001, 454),
    new Item(1003, 754)
};

Сортируем:

var sortList = testList.OrderBy(x => x.Id).ToList();

Ну и дальше 3 варианта:

  1. С помощью IndexOf():

    var listIndex = sortList.IndexOf(sortList.FirstOrDefault(x => x.Id == 1002));
    

    Как видите коротко и довольно просто, достаточно всего лишь получить нужный объект. Если же надо при помощи LINQ, то там придется немного городить...

  2. Полностью на LINQ:

    var linqIndex = sortList.Select((item, index) => new { item, index }).FirstOrDefault(x=>x.item.Id == 1002).index;
    

    Тут как видите чуть длиннее строка, ибо нам надо делать лишнее действие - составить список {index, item} и уже потом получить нужный индекс.

  3. Еще один вариант на чистом LINQ (спасибо @АндрейNOP):

    var whileIndex = sortList.TakeWhile(r => r.Id != 1002).Count();
    

    Берем элементы до тех пор, пока условие будет истинно и после считаем их кол-во, которое и будет нужным индексом.

  4. Ну и самое простое, FindIndex() (но и самое правильное):

    var findIndex = sortList.FindIndex(x => x.Id == 1002);
    

Все варианты нам в итоге дадут число 1.

Как правильно заметил в комментариях @АндрейNOP - все способы имеют свой недостаток и лучше использовать FindIndex(), ибо он выдаст с минимальными затратами нужный нам результат, хотя это и не является LINQ.

READ ALSO
Post и Get запросы

Post и Get запросы

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

134
Получить свойство наследника

Получить свойство наследника

У меня есть абстрактный класс со своими свойствами

126