[英]How to convert this for loop C# code to Linq or make the process time faster?
将此 for 循环 C# 代码转换为 Linq 或缩短处理时间
List<List<Array_Group>> array_Group = new List<List<Array_Group>>();
array_Group.Add(new List<Array_Group>());
object previosSelecter = null;
for (int i = 0; i < array_count; i++)
{
Type Group = typeof(Array_Group);
var current = after_Rounded.ElementAt(i);
Type type = current.GetType();
PropertyInfo prop = Group.GetProperty("FD_T_Act_");
object currentSelector = prop.GetValue(current);
if (previosSelecter == null)
{
array_Group.LastOrDefault().Add(current);
}
else
if (currentSelector.Equals(previosSelecter))
{
array_Group.LastOrDefault().Add(current);
}
else
{
array_Group.Add(new List<Array_Group>() { current });
}
previosSelecter = currentSelector;
}
由于需要处理大量数据,因此执行时间需要很长时间。 我怎样才能使它更简单和更快的执行?
尝试这个:
using System.Linq;
using System.Collections.Generic;
var array_Group = after_Rounded.GroupBy(x => (x as Array_Group)?.FD_T_Act_);
这将产生一个System.Collections.Generic.IEnumerable<System.Linq.IGrouping<string, T>>
其中 T 是after_Rounded
中的任何内容。
这两行
Type Group = typeof(Array_Group);
PropertyInfo prop = Group.GetProperty("FD_T_Act_");
您绝对可以在循环之前移动。 这是一个常量表达式,总是会产生相同的值,但它也是一个非常耗时的表达式。
通过“GetProperty”访问属性也非常耗时。
您可以创建一个委托来改进这一点(也在您的循环之前)
Func<Array_Group, propType> getter = (Func<Array_Group, propType>)
Delegate.CreateDelegate(typeof(Func<Array_Group, propType>), null,
prop.GetGetMethod());
它也是类型安全的,它返回您的真实数据类型,而不仅仅是 object,如果它是值类型,您可以避免使用这样的委托进行装箱。
所以而不是
object currentSelector = prop.GetValue(current);
你做
propType currentSelector = getter(current);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.