C # LINQ: обобщить конкретные свойства внутреннего класса из коллекции внешних классов - PullRequest
0 голосов
/ 27 февраля 2019

Рисование Цикл по свойствам объектов в C # и Использование LINQ для просмотра свойств внутреннего класса в коллекции внешних классов

Где у вас есть объекты (фаза)в коллекции (PhaseRepo), я считаю, что можно указать propertiesOfInterest в объектах (Phase) и создать словарь для обобщения свойств.

Ниже приведена моя попытка в LinqPad.Пожалуйста, помогите с синтаксисом или посоветуйте альтернативный подход.

Спасибо

enum Dir {Up, Dn}

struct BmkKey
{
    public Dir Direction;
    public string DetailType;
}

class Phase
{
    public Dir Direction { get; set; }
    public double StartToTerminationBars { get; set; }
    public double StartToTerminationPriceChange { get; set; }
    public double StartToTerminationGa { get; set; }
    public double NotRequiredProperty { get; set; }
}

class PhaseRepo
{
    public List<Phase> Phases { get; private set; }

    public List<Phase> GetPhases()
    {
        return new List<Phase>()
        { 
            new Phase() { Direction = Dir.Up, StartToTerminationBars = 3.0, StartToTerminationPriceChange = 4.0, StartToTerminationGa = 4.0},
            new Phase() { Direction = Dir.Up, StartToTerminationBars = 6.0, StartToTerminationPriceChange = 8.0, StartToTerminationGa = 4.0},
            new Phase() { Direction = Dir.Dn, StartToTerminationBars = 3.0, StartToTerminationPriceChange = -4.0, StartToTerminationGa = -4.0},
            new Phase() { Direction = Dir.Dn, StartToTerminationBars = 6.0, StartToTerminationPriceChange = -8.0, StartToTerminationGa = -4.0},
        };
    }
}

void Main()
{
    var phaseRepo = new PhaseRepo();
    var phases = phaseRepo.GetPhases();
    //phases.Dump();

    var propertiesOfInterest = typeof (Phase).GetProperties(BindingFlags.Public | BindingFlags.Instance)
    .Where(prop => prop.Name == "StartToTerminationBars" 
        || prop.Name == "StartToTerminationPriceChange" 
        || prop.Name == "StartToTerminationGa")
    .ToList();
    //propertiesOfInterest.Dump();

    // Please Help...
    var test = propertiesOfInterest
        .SelectMany(propertyInfo => phases
            .Select(phase => phase)
            .Select(keyValuePair => new
            {
                phase.Direction,
                keyValuePair.Key,
                keyValuePair.Value
            })
            .Select(arg => new
            {
                Key = new BmkKey
                {
                    Direction,
                    DetailType = propertyInfo.Name
                },
                Value = (double)propertyInfo.GetValue(arg.Value, null)
            }))
        .GroupBy(grp => grp.Key)
        .ToDictionary(grp => grp.Key, grp => x => x.ToList());

    test.Dump();

}

Ожидаемый результат:

enter image description here

1 Ответ

0 голосов
/ 28 февраля 2019

Решение

Заменить деталь после

// Пожалуйста, помогите ...

следующим:

    var test = propertiesOfInterest
        .SelectMany(propertyInfo => phases
            .Select(phase => new
            {
                phase.Direction,
                propertyInfo.Name,
                Value = (double)propertyInfo.GetValue(phase)
            }))
        .GroupBy(o => new BmkKey { Direction = o.Direction, DetailType = o.Name })
        .ToDictionary(grp => grp.Key, grp => grp.Select(x => x.Value));

Это, по сути, дает ожидаемый результат, показанный в вашем вопросе.(Порядок другой; настройте его с помощью OrderBy () в соответствии с вашими потребностями.)

Пояснение

В вашем коде было несколько проблем, но основные проблемы были:

  1. Вызов GetValue () вызван не для того объекта
  2. Селектор ключа в вызове .ToDictionary () .

Кроме того, следующее не является неправильным, но ненужным:

  1. Вызов .Select (phase => phase) , который ничего не делает- как строка кода, задающая x = x;
  2. Создание ключа перед группировкой.Вместо этого вы можете просто определить ключ во время операции .GroupBy () .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...