【问题标题】:Search for a list item attribute with another attribute value of the item搜索具有项的另一个属性值的列表项属性
【发布时间】:2014-07-04 07:57:37
【问题描述】:

我有这样的课:

class item   
{
    public string itemID { get; set; }
    public string itemName { get; set; }
    public decimal itemPrice{ get; set; }
}

我有一个这样的列表:

List<item> myItems = new List<item>();

我想获取最低价格的商品的id。

我得到这样的最低价格:

var minprice = myItems.Min(itemobj => itemobj.itemPrice);

如何获取具有 minprice 的对象的项目 ID?或者换句话说,对象的 itemID 是:

itemPrice == minprice;

【问题讨论】:

    标签: c# linq list object


    【解决方案1】:

    试试这个:

    尝试获取整个项目

    var minPriceItem = myItems.OrderBy(i => i.itemPrice).FirstOrDefault();
    

    然后使用它的属性:

    decimal price = minPriceItem.itemPrice;
    
    string id = minPriceItem.itemID;
    

    【讨论】:

    • 当您在汽车陈列室中搜索最便宜的汽车时,您会重新排列它们以将最便宜的汽车放在门口吗?
    【解决方案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);
    

    【讨论】:

    • 我更喜欢两个线性操作(最小和搜索)而不是排序整个列表以获得一个项目。
    • 两个线性操作的效率不如n log(n)复杂度的排序?
    • @GrantWinney,我不喜欢微优化,但我相信“性能感知思维”是一个好习惯。如果这个列表中有数百万个项目怎么办?
    猜你喜欢
    • 1970-01-01
    • 2015-05-09
    • 2019-12-16
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    相关资源
    最近更新 更多