我有一個List
的Objects
(大約100k),必須重複以產生一個Dictionary
。然而 代碼是在一行Linq的性能低下凡其他語言
public class Item{
public int ID;
public int Secondary_ID;
public string Text;
public int Number;
}
數據看起來是這樣(100K線)
ID | Secondary_ID | Text | Number
1 | 1 | "something" | 3
1 | 1 | "something else"| 7
1 | 1 | "something1" | 4
1 | 2 | "something2" | 344
2 | 3 | "something3" | 74
2 | 3 | "something4" | 1
進行得非常緩慢,特別是,我想它看起來像這樣結束的時候。 (任何集合會做,說實話)
Dictionary<int, string>
Key | Value
(secondary_ID) | (Text : Number)
1 | "Something : 3, Something else : 7, Something1 : 4"
2 | "Something2 : 344"
3 | "Something3 : 74, Something4 : 1"
我的代碼目前是這樣的ListAll
包含的所有數據。
var Final=new Dictionary<int, string>();
var id1s=ListAll.Select(x => x.ID).Distinct().ToList();
foreach(var id1 in id1s) {
var shortList=ListAll.Where(x => x.ID==id1).ToList(); //99% of time spent is here
var id2s=shortList.Select(x => x.Secondary_ID).Distinct().ToList();
foreach(var id2 in id2s) {
var s=new StringBuilder();
var items=shortList.Where(x => x.Secondary_ID==id2).ToList();
foreach(var i in items) {
s.Append(String.Format("{0} : {1}", i.Text, i.Number));
}
Final.Add(id2, s.ToString());
}
}
return Final;
現在輸出然而正確的,因爲在上面的評論說,這需要一個非常長的時間來處理(90秒 - 肯定比我與舒適),並想知道是否有更快的方式實現這一點。
此代碼只會被使用一次,所以不是一個真正的正常用法,通常我會因爲這個原因而忽略它,但想知道學習的目的。
那不是你真正的代碼,是嗎?文本,數字變量不存在,並且您也沒有向stringbuilder添加任何逗號... – digEmAll
輸入數據在哪裏?如果你編寫一個運行於其上的IQueryable,你可能會獲得更好的性能。 SQL數據庫 – Rob
你有很多冗餘的ToList調用。沒有必要將一個'IEnumerable'轉換成列表,當你要做的唯一事情就是在'foreach'中迭代它或調用另一個LINQ方法。這只是浪費處理器時間和內存。 – Servy