Поиск атрибута элемента списка с другим значением атрибута элемента

#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, я не фанат микрооптимизации, но «мышление, ориентированное на производительность», я считаю, хорошая привычка. Что, если в этом списке будут миллионы элементов?