Welcome to JiKe DevOps Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
433 views
in Technique[技术] by (71.8m points)

database - Performance of foreach loop In C#

I am working on C# API's which gets data from database. I inserted around 19500 records in database for testing performance. Here, sampledData contains 19500 records.

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);
}

In filteredList, I get 1404 records. It takes time in foreach loop to filter data. Is there any way to optimize performance?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

Please log in or register to answer this question.

1 Answer

0 votes
by (71.8m points)

I suggest checking with a help of HashSet<T>, not List<T> since filteredList .Any(...) has quadratic (O(n**2)) time complexity while !knownNames.Add(...) is linear (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);
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to JiKe DevOps Community for programmer and developer-Open, Learning and Share
...