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