有没有办法使用linq循环对象列表的属性?

时间:2017-08-24 13:51:25

标签: c# linq

我想动态创建一个字典,其中键将是对象属性的名称,该值将是选择该属性的linq查询的结果。

MyObject[] records = getRecords(); 
foreach (property in MyObject.GetType().GetProperties())
{
    data[property.Name] = records.Select(r => new { x = r.Date.ToString(), y = r.propertyInfo}).ToArray(); 
}

2 个答案:

答案 0 :(得分:8)

您需要使用更多反射:

property.GetValue(r)

您还应该使用ToDictionary()

data = typeof(MyObject).GetProperties().ToDictionary(p => p.Name, p => ...)

答案 1 :(得分:0)

首先,MyObject是一个类,而不是一个对象。 GetType()MyObject的非静态函数,因此您只能在创建new Myobject()之后调用我假设您要使用typeof(MyObject)

  • 首先,我们为类PropertyInfo的所有公共可读属性创建MyObject个对象的序列。
  • 然后,对于每个propertyInfo,我们在记录中创建每个MyObject的属性值序列。
  • 最后我们将序列放在一个词典中

请注意,在以小步骤创建查询时,不会枚举任何内容,只会创建查询。只会枚举GetPropertiesToDictionary

IEnumerable<MyObject> records = GetRecords();
IEnumerable<PropertyInfo> readableProperties= typeof(MyObject).GetProperties
    .Where(property => property.CanRead);

var propertyValues = readableProperties   // for every property
    .Select(propertyInfo => new           // create one new object of anonymous type
{                                                     
    PropertyName = propertyInfo.Name,     // with the name of the property
    PropertyValues = records              // and a sequence of all values of this property
        .Select(record => propertyInfo.GetValue(record))
}

最后到字典:key是属性名,value是propertyValues的序列:

var result = propertyValues       // put every item in the collection of propertyValues
    .ToDictionary(                // into a dictionary 
    item => item.PropertyName,    // Key is the PropertyName of each item
    item => item.PropertyValues); // Value is the sequence of PropertyValues of each item