2 Вопрос: Как определить наибольшее значение в списке свойств

вопрос создан в Wed, May 8, 2019 12:00 AM

У меня есть такой класс:

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, которые мне нужно исключить.

Мой вопрос: есть ли другой способ добиться этого?

    
0
  1. В этом случае вы должны использовать какую-то коллекцию
    2019-05-08 15: 47: 29Z
  2. Существует ли шаблон для имени свойств, которые необходимо сравнить? Ваш второй подход - лучший способ продвинуться вперед, если бы можно было составить мета-список имен свойств, которые вам нужно будет сравнить, и использовать этот список для фильтрации свойств
    2019-05-08 15: 51: 42Z
  3. @ OldProgrammer Боюсь, у меня нет никакого контроля над структурой класса.
    2019-05-08 15: 56: 49Z
2 ответа                              2                         

Я бы посоветовал вам использовать коллекцию или список вместо объекта для того же типа данных.

Но для вашего вопроса вы можете попытаться использовать отражение 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

    
3
2019-05-08 15: 54: 48Z
  1. У меня нет контроля над структурой класса. Спасибо за это; однако это использует отражение.
    2019-05-08 16: 00: 15Z

Коллекция определенно облегчит эту задачу. Если вы решите пойти по этому пути, у вас все еще могут быть свойства для 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;
    }
}
    
0
2019-05-08 16: 04: 34Z
источник размещен Вот