簡體   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