Список книг по приоритету


#region GetBookListByPriority
private static List<BCBook> GetBookListByPriority(List<BCBook> listBcBook)
{
    List<BCBook> newList = new List<BCBook>();
    try
    {
        List<BCBook> listNonPriorityBcBooks = new List<BCBook>();
        List<BCBook> listPriorityBcBooks = new List<BCBook>();

        foreach (BCBook bcBook in listBcBook)
        {
            BookHistoryDto historyDto = new BookHistoryFacade().FindHistoryByBookIdByPriority(bcBook.id.ToString(CultureInfo.CurrentCulture));
            if (historyDto != null && historyDto.HistoryId > 0)
            {
                bcBook.Priority = historyDto.Priority;
                listPriorityBcBooks.Add(bcBook);
            }
            else
            {
                listNonPriorityBcBooks.Add(bcBook);
            }
        }
        int count = 0;
        int prio = 0;
        foreach (BCBook bcBook in listNonPriorityBcBooks)
        {
            for (int j = count + 1; j <= 5; j++)
            {
                List<BCBook> listBook = new List<BCBook>();
                listBook = ListBookPriority(listPriorityBcBooks, j, newList);
                count++;
                if (listBook.Count() > 0)
                {
                    prio++;
                }
                else
                {
                    break;
                }
                foreach (BCBook bc in listBook)
                {
                    newList.Add(bc);
                }
            }
            newList.Add(bcBook);
        }
    }
    catch (Exception ex)
    {
        ErrorLogger.WriteErrorToLog(ex);
    }

    return newList;
}
#endregion

#region ListBookPriority
private static List<BCBook> ListBookPriority(List<BCBook> list, int priority, List<BCBook> newList)
{

    List<BCBook> listBook = new List<BCBook>();
    try
    {
        foreach (BCBook vid in list)
        {
            if (!IsExists(newList, vid.id.ToString(CultureInfo.CurrentCulture)))
            {
                if (vid.Priority == priority)
                {
                    listBook.Add(vid);
                }
            }
        }
    }
    catch (Exception ex)
    {
        ErrorLogger.WriteErrorToLog(ex);
    }
    return listBook;
} 
#endregion


2017
4
задан 6 июля 2011 в 09:07 Источник Поделиться
Комментарии
6 ответов

Я хотел избавиться от оператора foreach и использовать для. Я считал (и читал об этом) огромная разница в производительности между 2 (редактирование, но не всегда, см. ниже).

Пример (непроверенных код):

int c  = listBcBook.Count;

for (int i = 0; i < c; i++)
{
BCBook bcBook = listBcBook[i];

BookHistoryDto historyDto = new BookHistoryFacade().FindHistoryByBookIdByPriority(bcBook.id.ToString(CultureInfo.CurrentCulture));
if (historyDto != null && historyDto.HistoryId > 0)
{
bcBook.Priority = historyDto.Priority;
listPriorityBcBooks.Add(bcBook);
}
else
{
listNonPriorityBcBooks.Add(bcBook);
}
}

Редактировать: я только что прочитал, что разница в производительности не всегда есть, потому что в некоторых случаях, компилятор будет оптимизировать циклы foreach петли В для петли. Здесь хорошо читать на так: https://stackoverflow.com/questions/1124753/for-vs-foreach-loop-in-c.

В вашем случае, поскольку вы используете список, напрямую используя для должны быть быстрее.

2
ответ дан 6 июля 2011 в 11:07 Источник Поделиться

Пока у меня нет времени на данный момент, чтобы просмотреть код на данный момент (и из-за отсутствия комментариев) я не могу дать широкий ответ, но я уже могу отметить две вещи.

Инициализировать ваш фасад вне цикла for.

BookHistoryFacade() facade = new BookHistoryFacade();
foreach (BCBook bcBook in listBcBook)
{
BookHistoryDto historyDto =
facade.FindHistoryByBookIdByPriority(bcBook.id.ToString(CultureInfo.CurrentCulture));
...
}

Использование технологии LINQ для запросов, которые также позволяют легко попытка параллельный LINQ. Это даст вам возможность использовать несколько ядер для вашего запроса ... ака, как увеличение скорости.

2
ответ дан 7 июля 2011 в 12:07 Источник Поделиться

Вы можете заменить два цикла foreach в GetBookListByPriority, где вы добавляете весь список в новый список с этими:

newList.AddRange(listBook);
newList.AddRange(listNonPriorityBcBooks);

0
ответ дан 7 июля 2011 в 06:07 Источник Поделиться

Его довольно непонятно, что код делает/должен делать. Но я пытался сократить часть кода так что попробуйте эту (явно непроверенные) и посмотреть, если своим быстрее и делает то же самое :)

    private static List<BCBook> GetBookListByPriority(List<BCBook> listBcBook)
{
List<BCBook> newList = new List<BCBook>();
try
{
List<BCBook> listNonPriorityBcBooks = new List<BCBook>();
List<BCBook> listPriorityBcBooks = new List<BCBook>();
// move the variable historyDto outside the for loop so you create the object less.
BookHistoryDto historyDto;
foreach (BCBook bcBook in listBcBook)
{
historyDto = new BookHistoryFacade().FindHistoryByBookIdByPriority(bcBook.id.ToString(CultureInfo.CurrentCulture));
if (historyDto != null && historyDto.HistoryId > 0)
{
bcBook.Priority = historyDto.Priority;
listPriorityBcBooks.Add(bcBook);
}
else
{
listNonPriorityBcBooks.Add(bcBook);
}
}

int count = 1;
foreach (BCBook bcBook in listNonPriorityBcBooks)
{
// move the variable listBook outside the for loop so you create the object less.
List<BCBook> listBook;
// if you are only having a maximum of 5 then there is no need to create an extra variable, use the existing count
for (count; count <= 5; count++)
{
listBook = ListBookPriority(listPriorityBcBooks, count, newList);
// Count() is slower than Count, note the difference in the removal of the brackets
if (listBook.Count > 0)
{
// Only if the count is greater than 0 do we want to begin to enumerate the collection
foreach (BCBook bc in listBook)
{
newList.Add(bc);
}
}
else
{
break;
}
}
newList.Add(bcBook);
}
}
catch (Exception ex)
{
ErrorLogger.WriteErrorToLog(ex);
}

return newList;
}

Если бы вы могли комментировать ваш оригинальный код, который вы получили бы лучший ответ, я уверен

0
ответ дан 9 июля 2011 в 08:07 Источник Поделиться

Вы ничего не оптимизируя при этом:

int count = 1; 
// Some code here
for (count; count <= 5; count++)
{

Это равные по скорости, но уступает по стилю:

// Some code here
for (int count = 1; count <= 5; count++)
{

Избежать этих "микро-оптимизации". Даже если все сделано правильно, часто бывает так, что вы будете иметь гораздо лучше вещей, чтобы улучшить.

0
ответ дан 9 июля 2011 в 11:07 Источник Поделиться

Если вы не хотите использовать LINQ, как Стивен говорит о том, рассматривали ли вы парам? Просто реализовать интерфейс icomparable по приоритетным объектом, если он уже не.

0
ответ дан 16 июля 2011 в 08:07 Источник Поделиться