C#中foreach循环的性能

Abh*_*ngh -4 c# database api performance performance-testing

我正在研究从数据库中获取数据的 C# API。我在数据库中插入了大约19500条记录以测试性能。这里,sampledData包含19500条记录。

var sampledData = await _dataContext.ItemsData
                                    .Include(i => i.ProcedureItem)
                                    .Include(i => i.ProcedureItem.ProcedureItem)
                                    .Include(i => i.ProcedureItem.ProcedureItemAll)
                                    .Where(i => i.Procedure.Status == true &&
                                                i.isValid== true &&
                                                i.Procedure.ID== ID).ToListAsync();

// Foreach loop on 19500 records to filter data and store them info list
var filteredList = new List<ProcedureFilteredData>();

foreach(var s in sampledData )
{
    if (filteredList.Any(i => i.ProcedureItem == s.ProcedureItem.ProcedureItem.Name))
    {
        continue;
    }

    var pData = new ProcedureFilteredData
    {
        ProcedureItemAll = s.ProcedureItem.Name
    };

    filteredList.Add(pData);
}
Run Code Online (Sandbox Code Playgroud)

在 中filteredList,我得到1404条记录。它需要时间foreach循环过滤数据。有没有办法优化性能

Dmi*_*nko 6

我建议与帮助检查HashSet<T>,而不是List<T>因为filteredList .Any(...)二次O(n**2))的时间复杂度,同时!knownNames.Add(...)线性的O(n)):

HashSet<string> knownNames = new HashSet<string>();

var filteredList = new List<ProcedureFilteredData>();

foreach (var s in sampledData)
{
    if (!knownNames.Add(s.ProcedureItem.ProcedureItem.Name))
        continue;  

    var pData = new ProcedureFilteredData
    {
        ProcedureItemAll = s.ProcedureItem.Name
    };

    filteredList.Add(pData);
}
Run Code Online (Sandbox Code Playgroud)