У меня есть список объектов linq Объект:
{id, count}
Они расположены по возрастанию count, как я могу получить номер объекта в этом списке по id?
List<Route> routes = _applicationDbContext.Routes.OrderBy(a =>a.count).ToList();
Как это можно сделать?
Если я правильно понял, то вам нужен "индекс", так? Если да, то для этого у 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 варианта:
С помощью IndexOf()
:
var listIndex = sortList.IndexOf(sortList.FirstOrDefault(x => x.Id == 1002));
Как видите коротко и довольно просто, достаточно всего лишь получить нужный объект. Если же надо при помощи LINQ, то там придется немного городить...
Полностью на LINQ
:
var linqIndex = sortList.Select((item, index) => new { item, index }).FirstOrDefault(x=>x.item.Id == 1002).index;
Тут как видите чуть длиннее строка, ибо нам надо делать лишнее действие - составить список {index, item}
и уже потом получить нужный индекс.
Еще один вариант на чистом LINQ
(спасибо @АндрейNOP):
var whileIndex = sortList.TakeWhile(r => r.Id != 1002).Count();
Берем элементы до тех пор, пока условие будет истинно и после считаем их кол-во, которое и будет нужным индексом.
Ну и самое простое, FindIndex()
(но и самое правильное):
var findIndex = sortList.FindIndex(x => x.Id == 1002);
Все варианты нам в итоге дадут число 1.
Как правильно заметил в комментариях @АндрейNOP - все способы имеют свой недостаток и лучше использовать FindIndex()
, ибо он выдаст с минимальными затратами нужный нам результат, хотя это и не является LINQ.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Как правильно формировать заголовки при обращении к сайтам с помощью HttpClient чтобы они показали документ такой же - как показывают браузеру...