Разделение объекта с использованием отражения

#c# #linq #reflection

#c# #linq #отражение

Вопрос:

У меня есть следующий тип объекта

 public class TestClass
{
    public string Property_1;
    public string Property_2;
    public int property_3;
    public DateTime TimeStame;
}
  

И мой источник данных возвращает список этих

 List<TestClass> DataResponse;
  

Я пытаюсь сгруппировать все данные так, чтобы все Property_1 были сгруппированы по дате и одинаковы для всех других свойств. Итак, по сути, я получаю:

 Dictionary<DateTime, List<Property_1>>
Dictionary<DateTime, List<Property_2>>
Dictionary<DateTime, List<Property_3>>
  

Я могу повторить свойства, используя:

 foreach (var property in typeof(TestClass).GetProperties())
{

}
  

Но я немного не уверен, как использовать linq для заполнения словарей.

Любая помощь была бы отличной! Спасибо

Комментарии:

1. Знаете ли вы имена свойств заранее? Если это так, не используйте отражение, просто напишите простую инструкцию LINQ для этого. Если это для произвольного класса с N свойствами еще одной именованной меткой времени, то создайте список объектов MethodImpl, которые ссылаются на средства получения свойств (создайте список вне цикла). Затем в цикле используйте каждый метод IMPL для чтения свойства, поскольку некоторые из ваших свойств являются строковыми, а некоторые — int, что усложнит вам жизнь

2. Ваши объявления в словаре неверны. Property_N это имя свойства, а не тип. И у вас не будет Dictionary<DateTime, List<TypeOfProperty1>> , в итоге вы получите `Dictionary<DateTime, TypeOfProperty1>, если я не очень запутался

3. И… Вам, вероятно, даже не нужен словарь. Я предполагаю, что вы хотите это как временной ряд, с парами временная метка / значение. У словарей нет гарантии порядка (если вы перечисляете словарь, вы не обязательно получаете вещи в том же порядке, в котором вы вставили материал в коллекцию). Вы, вероятно, хотите List<KeyValuePair<DateTime, TypeOfPropertyN>> . Это хорошее представление временного ряда

Ответ №1:

Я думаю, что что-то подобное должно сработать

 var prop1 = new Dictionary<DateTime, List<string>>();
var prop2 = new Dictionary<DateTime, List<string>>();
var prop3 = new Dictionary<DateTime, List<int>>();

foreach (var grouped in list.GroupBy(l => l.TimeStamp))
{
    prop1.Add(grouped.Key, grouped.Select(i => i.Property_1).ToList());
    prop2.Add(grouped.Key, grouped.Select(i => i.Property_2).ToList());
    prop3.Add(grouped.Key, grouped.Select(i => i.Property_3).ToList());
}
  

Ответ №2:

Оригинал

Отражение кажется излишним. Вы могли бы просто использовать ToDictionary

 var result1 = DataResponse.ToDictionary(x => x.Property_1);
var result2 = DataResponse.ToDictionary(x => x.Property_2);
var result3 = DataResponse.ToDictionary(x => x.Property_3);
  

Если вам нужно больше детализации по группе, используйте GroupBy

если вы хотите квантовать дату без времени, вы могли бы использовать x.Property_3.Date


Обновлено

Однако, обдумывая это, вам, вероятно, следует просто использовать GroupBy

 var result1 = DataResponse.GroupBy(x => x.Property_1);
var result2 = DataResponse.GroupBy(x => x.Property_2);
var result3 = DataResponse.GroupBy(x => x.Property_3);

...

foreach(var result in result1)
{
    // do something with your groups
}