在C#中查找(属性)集合的最小值

时间:2010-09-29 22:33:50

标签: c# .net linq collections minimum

给出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?我对各方面都很感兴趣。 谢谢, 戴夫

奖金问题(也许这对我来说很明显,最小/最大的答案)。有哪些选项可以决定某个值(例如Speed已经在集合中)。从这个例子中不清楚,但可能的情况是,如果你已经拥有某个给定自变量的某些数据(例如时间),你就不再需要了。那么有没有像Collection.Contains(“指定你感兴趣的属性”)?

3 个答案:

答案 0 :(得分:13)

using System.Linq;

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

另见:
LINQ MSDN documentation
LINQ to Objects 5 Minute Overview

答案 1 :(得分:2)

添加到gaearon的答案:

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

会让你达到最低限度。但你可能会自己想出来;)

您可以查看使用linq查找最大/最小值的this link on MSDN's site

答案 2 :(得分:2)

要回答关于“包含”类型的方法的问题,如果您想要布尔指示其存在,可以使用Any方法,或者可以使用FirstOrDefault查找第一个EngineMeasurement {1}}满足条件的事件。如果它存在,它将返回实际对象,否则它将返回该对象的默认值(在这种情况下为null)。

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