自定义对象 c# 的一个 属性 的最小值的 LINQ 索引

LINQ index of min value of one Property of a Custom Object c#

我有一个自定义对象,其中包含一个具有许多属性的对象。

这是我的自定义对象:-

    private class ClosingBookItem
    {
        public IOrder Order;
        public double EntryPrice;

        // Maximum Adverse Effect Price
        public double MAEP;

        // closing order has a target of mean price
        public bool MidTarget;

        public ClosingBookItem(IOrder order, double entryPrice, double maep, bool midTarget)
        {
            Order       = order;
            EntryPrice  = entryPrice;
            MAEP        = maep;
            MidTarget   = midTarget;
        }
    }

对象订单有一个 属性 是一个名为 LimitPrice 的 Double。

我已经创建了这个自定义对象的列表:-

List<ClosingBookItem> closingsBook      = new List<ClosingBookItem>();

如何 return 列表中包含 Order.LimitPrice 最小值的项目的索引?

我环顾四周,但找不到合适的描述,并尝试了一些方法,但都没有成功。

您可以使用

double minLimitPrice = closingsBook.Min(b => b.Order.LimitPrice);
int index = closingsBook.FindIndex(b => b.Order.LimitPrice == minLimitPrice);

另一种纯 LINQ 方法:

index = closingsBook.Select((b, ix) => new { Book = b, Index = ix })
    .OrderBy(x => x.Book.Order.LimitPrice)
    .First()
    .Index;

如果要查找所有索引,完全没有问题:

IEnumerable<int> allIndexes = closingsBook.Where(b => b.Order.LimitPrice == minLimitPrice);
Console.WriteLine(String.Join(",", allIndexes));  // f.e.

选择所有索引的纯 LINQ 方法:

IEnumerable<int> allIndexes = closingsBook.Select((b, ix) => new { Book = b, Index = ix })
    .GroupBy(x => x.Book.Order.LimitPrice)  // build groups per LimitPrice
    .OrderBy(g => g.Key)                    // order by that ascending
    .First()                                // take the group with lowest LimitPrice
    .Select(x => x.Index);                  // select the indexes of that group

根据 Tim 的回答,您将获得第一个符合条件的项目。

以防万一你有几件价格相同的商品,并且你想获得所有这些商品的索引,你可以使用这个:

int minPrice = closingsBook.Min(book => book.LimitPrice);

var indexes = closingsBook.Select((book, index) => new { book, index })
             .Where(x => x.book.LimitPrice== minPrice)
             .Select(x => x.index);