#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
}