#c# #linq #list #object
#c# #linq #Список #объект
Вопрос:
У меня есть класс, подобный этому:
class item
{
public string itemID { get; set; }
public string itemName { get; set; }
public decimal itemPrice{ get; set; }
}
У меня есть списки, подобные этому:
List<item> myItems = new List<item>();
Я хочу получить идентификатор элемента с минимальной ценой.
Я получаю минимальную цену следующим образом:
var minprice = myItems.Min(itemobj => itemobj.itemPrice);
Как я могу получить идентификатор элемента объекта, который имеет minprice? Или, другими словами, ItemId объекта, который является:
itemPrice == minprice;
Ответ №1:
Попробуйте это :
Попробуйте получить весь элемент
var minPriceItem = myItems.OrderBy(i => i.itemPrice).FirstOrDefault();
Затем просто используйте его свойства:
decimal price = minPriceItem.itemPrice;
string id = minPriceItem.itemID;
Комментарии:
1. Когда вы будете искать самую дешевую машину в автосалоне, собираетесь ли вы переставить их все, чтобы иметь самую дешевую рядом с дверью?
Ответ №2:
Я бы, вероятно, сделал это следующим образом:
var minprice = myItems.Min(itemobj => itemobj.itemPrice);
// use .First instead of .Single in case there are 2 or more items with the same min price
// use .FirstOrDefault instead of .First in case the sequence is empty
var itemWithMinPrice = myItems.FirstOrDefault(itemobj => itemobj.itemPrice == minprice);
Если вам нужны все элементы с минимальной ценой:
var itemsWithMinPrice = myItems.Where(itemobj => itemobj.itemPrice == minprice);
Вы также можете продвинуться с помощью агрегатной функции
var itemWithMinPrice = myItems.Aggregate((cheapestItem, nextItem) => (cheapestItem == null || cheapestItem.itemPrice > nextItem.itemPrice) ? nextItem : cheapestItem);
Или вы можете использовать MoreLINQ (я могу порекомендовать это, MoreLINQ — это фантастика)
var itemWithMinPrice = myItems.MinBy(itemobj => itemobj.Price);
Комментарии:
1. Я предпочитаю две линейные операции (min и search), чем сортировать весь список только для получения одного элемента.
2. Две линейные операции менее эффективны, чем сортировка по
n log(n)
сложности?3. @GrantWinney, я не фанат микрооптимизации, но «мышление, ориентированное на производительность», я считаю, хорошая привычка. Что, если в этом списке будут миллионы элементов?