2013-12-17 191 views
0

假設有一類提高LINQ查詢性能

public class StopTime 
{ 
    public TimeSpan? ArrivalTime { get; set; } 
    public TimeSpan? DepartureTime { get; set; } 
    public string StopID { get; set; } 
    public int StopSequence { get; set; } 
    public string TripID { get; set; } 
} 

我不得不從一個CSV文件中讀取數據並將其映射到所提到的類。 CSV文件可以有很多記錄,在我的情況下大約有500000條記錄。

在我解析CSV文件並將數據映射到StopTime列表中的不同功能之後,我想根據TripId篩選StopTimes。 在我的場景中,我在StopTime的列表中約有8000個TripId s。

我試圖創建使用此代碼列表的字典:

var TripIdStops = new Dictionary<string, List<StopTime>>(); 

foreach (var tripId in ListOfTripId) 
{ 
    TripIdStops.Add(tripId, StopTimes.Where(x=>x.TripID==tripsDistinct).ToList()); 
} 

要創建字典,這個循環能夠篩選出StopTime S,記得50萬次的記錄和TripIds 8000個實例。

但是,這是一個非常耗時的任務。有沒有辦法提高性能?

回答

2

這聽起來像你想有一個lookup

var stopTimesByTripId = StopTimes.ToLookup(st => st.TripId); 

或者通過ListOfTripId首先將它縮小:

var tripIdSet = new HashSet<string>(ListOfTripId); 
var stopTimesByTripId = StopTimes.Where(st => tripIdSet.Contains(st.TripId)) 
           .ToLookup(st => st.TripId); 

在你只需要通過StopTimes迭代一旦這兩種情況。

1

您可以改爲創建lookup表。

表示每個映射到一個或多個值的鍵的集合。

var lookup = StopTimes.ToLookup(st => st.TripId); 
1

我建議循環變化:經過StopTimes,東西 這樣的:

var TripIdStops = new Dictionary<string, List<StopTime>>(); 

foreach (var time in StopTimes) { 
    List<StopTime> list; 

    if (TripIdStops.TryGetValue(time.TripID, out list)) 
    list.Add(time); 
    else 
    TripIdStops.Add(time.TripID, new List<StopTime>() { time }); 
}