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

本文关键字:属性 一个 最小值 LINQ 索引 对象 自定义 | 更新日期: 2023-09-27 18:00:11

我有一个自定义Object,它包含一个具有许多属性的Object。

这是我的自定义对象:-

    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;
        }
    }

Object Order有一个名为LimitPrice的Double属性。

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

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

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

我四处寻找,但找不到一个好的描述,尝试了一些东西,但没有成功。

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

您可以使用

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);