如何确定属性列表中的最大值

时间:2019-05-08 15:46:18

标签: c#

我有一个这样的课程:

class MyClass
{
    public int Value1 {get; set;}
    public int Value2 {get; set;}
    public int Value3 {get; set;}
    public int Value4 {get; set;}
    ...

    public string AnotherValue {get; set;}
}

实际上,大约有10个属性,所有属性均具有值。我想做的是确定具有最高值的属性。我最初以为这将是一件微不足道的任务,但是到目前为止,我仅设法提出了两种方法来实现它,而这两种方法都不是很优雅。

我的第一种方法是简单地测试每个值:

int runningValue = myClass.Value1;
if (myClass.Value2 > runningValue)
    runningValue = myClass.Value2;
// etc...

第二种方法是使用反射来执行相同的操作,但是循环使用所有属性-尽管这并不理想,因为有些属性(例如AnotherValue)需要排除。

我的问题是:还有另一种方法可以实现这一目标吗?

2 个答案:

答案 0 :(得分:3)

我建议您使用集合或列表而不是对象来承载相同的数据类型。

但是对于您的问题,您可以尝试使用 reflection GetProperties从对象中获取所有想要比较的数据。

x.PropertyType == typeof(int)可以确保您想与int进行比较的问题的类型。

MyClass a = new MyClass()
{
    Value1 =  10,
    Value2 = 11,
    Value3 = 12,
    Value4 = 14
};

a.GetType()
    .GetProperties()
    .Where(x => x.PropertyType == typeof(int) )
    .Select(x => Convert.ToInt32(x.GetValue(a)))
    .Max(x=>x);

c# online

答案 1 :(得分:0)

集合肯定会使此任务容易得多。如果决定走这条路线,您仍然可以拥有Value1 / Value2 / etc ..等属性,但是您必须实现get / set访问器才能在集合中查找数据。如果您知道每个值位于哪个索引,它可能就很简单

private List<int> Values = new List<int>(3);

public int Value1 {
    get => Values[0];
    set => Values[0] = value;
}

public int Value2 {
    get => Values[1];
    set => Values[1] = value;
}

如果您真的想走反射路线,则可以创建一个属性来指定确定最大值时要包括的属性

[AttributeUsage(AttributeTargets.Property)]
public class IncludeInMaxAttribute : Attribute
{
}

public class MyClass {
    [IncludeInMax]
    public int Value1 {get;set;}

    [IncludeInMax]
    public int Value2 {get;set;}

    public string AnotherValue {get;set;}

    public int GetMax()
    {
        int maxValue = int.MinValue;

        foreach (var prop in this.GetType().GetProperties())
        {
            if (prop.GetCustomAttribute<IncludeInMaxAttribute>() != null)
            {
                maxValue = (int) prop.GetValue(this);
            }
        }

        return maxValue;
    }
}