Итерация по списку очень медленная, как улучшить производительность - PullRequest
1 голос
/ 13 апреля 2020

У меня есть метод, который выполняет итерацию по списку и отображает результат каждого типа один, за которым следует другое, означающее, что я буду отображать результат из rd, затем из cv и adz. Но фактический метод очень медленный, и для получения результатов требуется много времени. Каковы способы повышения производительности и будет ли это иметь значение при использовании другой структуры данных

    private List<AllJobModel> GetAllJobModelsOrder(List<AllJobModel> result)
    {
        var countItems = result.Count;
        List<AllJobModel> list = new List<AllJobModel>();
        while (countItems != 0)
        {
            for (int i = 0; i < countItems; i++)
            {
                if (result.ElementAt(i).JobImage.Contains("rd"))
                {
                    list.Add(result.ElementAt(i));
                    result.RemoveAt(i);
                    countItems--;
                    break;
                }
            }

            for (int i = 0; i < countItems; i++)
            {
                if (result.ElementAt(i).JobImage.Contains("cv"))
                {
                    list.Add(result.ElementAt(i));
                    result.RemoveAt(i);
                    countItems--;
                    break;
                }
            }
            for (int i = 0; i < countItems; i++)
            {
                if (result.ElementAt(i).JobImage.Contains("adz"))
                {
                    list.Add(result.ElementAt(i));
                    result.RemoveAt(i);
                    countItems--;
                    break;
                }
            }
            for(int i =0; i < countItems; i++)
            {
                if((!result.ElementAt(i).JobImage.StartsWith("rd") && !result.ElementAt(i).JobImage.StartsWith("adz")) && !result.ElementAt(i).JobImage.StartsWith("cv"))
                {
                    list.Add(result.ElementAt(i));
                    result.RemoveAt(i);
                    countItems--;
                    break;
                }
            }
        }    
       return list;
    }

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Это плохой способ сортировки. Вы фактически зацикливаетесь на списке 4 раза, каждый раз извлекая определенные группы элементов c. У вас также есть потенциальная ошибка при удалении элементов во время итерации по списку. Несмотря на то, что вы можете внести множество улучшений в свой метод, лучше использовать OrderBy со следующим условием сортировки:

list = result.OrderBy( m => m.JobImage.Contains("rd")  ? 1 : 
                            m.JobImage.Contains("cv")  ? 2 :
                            m.JobImage.Contains("adz") ? 3 : 
                            4)
             .ToList();
0 голосов
/ 13 апреля 2020

Проверьте эту ссылку: https://cc.davelozinski.com/c-sharp/fastest-collection-for-string-lookups

Было очень полезно для меня.

Относительно вашей конкретной проблемы c. Похоже, вы делаете некоторую фильтрацию данных. У Linq есть простой способ сделать это. Я не тестировал производительность, но если вы можете дать мне пример данных, то я попробую его для вас. Это может быть что-то вроде этого.

    private List<AllJobModel> GetAllJobModelsOrder(List<AllJobModel> result)
    {
        return result.Where(x => x.JobImage.Contains("rd") || x.JobImage.Contains("cv") || x.JobImage.Contains("adz")).ToList();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...