繁体   English   中英

如何将此循环 C# 代码转换为 Linq 或加快处理时间?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM