我有一个采用通用IEnumerable并为每一列生成唯一值列表的方法。不用说这很慢,我想这是由于使用了所有反射所致。 这是一些示例代码:
usb.bas2_cva_sum_portfolio
我可以为每个属性生成一个值列表,而无需逐行浏览IEnumerable并将每个属性强制转换为对象吗?
是否有一种更快的方法来对IEnumerable中的每个项目执行类似操作?
private void PopulateReferenceMatrices(IEnumerable newValue)
{
Type t = newValue.GetType();
Type baseType = t.GetGenericArguments()[0];
PropertyInfo[] properties;
Dictionary<string, int> indexValues = new Dictionary<string, int>();
properties = baseType.GetProperties();
int numProperties = properties.Count();
ListValues = new List<object>[numProperties];
for (int i = 0; i < numProperties; i++)
{
indexValues.Add(properties[i].Name, i);
FilterValues[i] = new List<object>();
}
//populate values into array
foreach (dynamic da in newValue)
{
foreach (PropertyInfo d in properties)
{
Object property = d.GetValue(da);
ListValues[indexValues[d.Name]].Add(property);
}
}
}
答案 0 :(得分:1)
这里一个可能的问题是您传递的是一个可能与众不同的对象的非泛型集合,因此,创建propertyInfo应该在循环内部,以确保您可以从对象中读取该属性。如果确定非泛型集合内的所有对象都是同一类型,则可以从列表中的第一个对象(如果它至少具有一个实例)中读取循环外的propertyInfo。
您可以尝试此操作,请参见代码中的注释:
public static IList GetRowValue(IEnumerable value, string propertyName)
{
// create an arraylist to be the result
var result = new ArrayList();
// loop in the objects
foreach (var item in value)
{
// search for a property on the type of the object
var property = item.GetType().GetProperty(propertyName);
// if the property was found
if (property != null)
{
// read the property value from the item
var propertyValue = property.GetValue(item, null);
// add on the result
result.Add(propertyValue);
}
}
return result;
}
查看集合中具有不同对象的工作示例:https://dotnetfiddle.net/bPgk4h
答案 1 :(得分:0)
该问题与IEnumerable或反射无关。 尚未在IEnumerable中填充数据,因此我正在填充矩阵进行了数千次数据库调用。 解决此问题后,它会立即加载。