Как получить индекс элемента, который является максимальным в списке <T> - PullRequest
0 голосов
/ 11 мая 2018

У меня есть List с именем класса Product, и я хочу знать индекс элемента, который имеет максимальное значение ?

class Product
{
    public int ProductNumber { get; set; }
    public int ProductSize { get; set; }
}

List<Product> productList = new List<Product>();

int Index = productList.Indexof(productList.Max(a => a.ProductSize)); 

Я пробовал это, но не получил ответаИ получаю ошибку:

«Невозможно отлить как продукт»

Ответы [ 7 ]

0 голосов
/ 11 мая 2018

Вот решение с Enumerable.Range:

int index = Enumerable.Range(0, productList.Count)
                      .FirstOrDefault(i => productList[i].ProductSize == productList.Max(x => x.ProductSize));

ДЕМО ЗДЕСЬ

0 голосов
/ 11 мая 2018

Предполагается, что список не пуст:

productList.Indexof(productList.OrderByDescending(a => a.ProductSize).First());
0 голосов
/ 11 мая 2018

Вы ищете ArgMax, который не реализован в Linq , но может быть легко эмулирован с помощью Aggregate:

  int Index = productList
    .Select((item, index) => new { item, index })
    .Aggregate((s, v) => v.item.ProductSize > s.item.ProductSize ? v : s)
    .index;
0 голосов
/ 11 мая 2018

Вы можете сначала сопоставить каждый элемент так, чтобы каждый продукт ассоциировался с его индексом, затем упорядочить по убыванию и получить первый элемент:

int Index = productList
    .Select((x, index) => new { Index = index, Product = x })
    .OrderByDescending(x => x.Product.ProductSize).First().Index;

Вам не нужен еще один вызов IndexOf!

0 голосов
/ 11 мая 2018

productList.Max (a => a.ProductSize) вернет максимальное значение ProductSize, а не объект Product.это условие должно быть в состоянии ГДЕ.

0 голосов
/ 11 мая 2018

Для этого требуется сортировка

var maxObject = productList.OrderByDescending(item => item.ProductSize).First();
var index = productList.IndexOf(maxObject);

Есть и другие, более простые способы сделать это. Например: в MoreLINQ есть метод расширения, который делает это.

См. этот вопрос

0 голосов
/ 11 мая 2018

Метод Max даст вам максимальный размер продукта, а не экземпляр продукта. Вот почему вы получаете эту ошибку.

Вы можете сделать это с OrderByDescending:

var item = productList.OrderByDescending(i => i.ProductSize).First();
int index = productList.IndexOf(item);
...