Нахождение минимальных значений (свойств) коллекций в C # - PullRequest
5 голосов
/ 30 сентября 2010

Учитывая следующий код из примера Microsoft:

public class EngineMeasurementCollection : Collection<EngineMeasurement>
{
    public EngineMeasurementCollection()
    {
        Add(new EngineMeasurement { Speed = 1000, Torque = 100, Power = 20 });
        Add(new EngineMeasurement { Speed = 2000, Torque = 160, Power = 60 });
        Add(new EngineMeasurement { Speed = 3000, Torque = 210, Power = 125 });
        Add(new EngineMeasurement { Speed = 4000, Torque = 220, Power = 160 });
        Add(new EngineMeasurement { Speed = 5000, Torque = 215, Power = 205 });
        Add(new EngineMeasurement { Speed = 6000, Torque = 200, Power = 225 });
        Add(new EngineMeasurement { Speed = 7000, Torque = 170, Power = 200 });
    }
}
public class EngineMeasurement
{
    public int Speed { get; set; }
    public int Torque { get; set; }
    public int Power { get; set; }
}

Как получить минимальную / максимальную скорость, крутящий момент или мощность.Мне нужно это, чтобы установить масштаб на графике, который я делаю (если быть точным, WPF Toolkit Chart).Я полагаю, у меня мог бы быть метод внутри EngineMeasurementCollection, который перебирает каждый EngineMeasurement и смотрит на Power (или Speed), но я подозреваю, что есть намного более простой способ?В классе Collection действительно есть какой-то метод Min, но обратите внимание, я не пытаюсь получить минимум коллекции (я не уверен, что это будет означать в этом случае), а, скорее, минимум определенного свойства (напр. скорость).Я видел использование Collection.Min с функторами.Есть ли что-то, что можно сделать там?Или с Linq?Я заинтересован во всех отношениях.Спасибо, Дейв

Бонусный вопрос (возможно, это будет очевидно для меня с ответом на мин / макс).Какие есть варианты, чтобы решить, если значение (например, скорость уже в коллекции).Это не ясно из этого примера, но может случиться так, что если у вас уже есть данные для данной независимой переменной (например, времени), вам больше не нужны.Так есть ли что-то вроде Collection.Contains («указать интересующее вас свойство»)?

Ответы [ 3 ]

13 голосов
/ 30 сентября 2010
using System.Linq;

var collection = new EngineMeasurementCollection();
int maxSpeed = collection.Max(em => em.Speed);

Смотри также:
Документация LINQ MSDN
LINQ к объектам Обзор за 5 минут

2 голосов
/ 30 сентября 2010

Чтобы ответить на ваш вопрос о методе типа «Содержит», вы можете использовать метод Any, если вы хотите логическое указание на его существование, или вы можете использовать FirstOrDefault, чтобы найти первое EngineMeasurement вхождение,удовлетворяет условию.Если он существует, он вернет реальный объект, в противном случае он вернет значение по умолчанию для этого объекта (в данном случае ноль).

bool result = collection.Any(m => m.Speed == 2000); // true

// or

var em = collection.FirstOrDefault(m => m.Speed == 2000);
if (em != null)
    Console.WriteLine("Torque: {0}, Speed: {1}", em.Torque, em.Speed);
2 голосов
/ 30 сентября 2010

Добавить к ответу Гаарона:

int minSpeed = collection.Min(em => em.Speed);

Получит вам минимум. Но вы бы наверняка поняли это сами;)

Вы можете взглянуть на эту ссылку на сайте MSDN , которая позволяет найти максимальные / минимальные значения с помощью linq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...