簡體   English   中英

改善LINQ查詢性能

[英]Improve LINQ query performance

假設有一堂課

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

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

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

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

要創建字典,此循環必須過濾StopTime ,記住500000條記錄和8000個TripId實例。

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

聽起來您想要查找

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一次即可。

您可以改為創建查找表。

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

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

我建議循環更改:經過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 });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM