Я был в тупике по этому поводу некоторое время. Я хочу взять список и заказать список, чтобы продукты с наибольшей ценой оказались в середине списка. И я также хочу сделать обратное, т.е. Убедиться, что элементы с наибольшей ценой попадают на внешние границы списка.
Представьте себе такую структуру данных, как это. 1,2,3,4,5,6,7,8,9,10
В первом сценарии мне нужно вернуться назад 1,3,5,7,9,10,8,6,4,2 Во втором сценарии мне нужно вернуться назад 10,8,6,4,2,1,3,5,7,9
В списке может быть более 250 наименований, цифры не будут равномерно распределены, и они не будут последовательными, и я хотел бы свести к минимуму копирование. Числа будут содержаться в объектах Product, а не простые примитивные целые числа.
Есть ли простое решение, которое я не вижу?
Любые мысли.
Итак, для тех из вас, кто задается вопросом, что я делаю, я заказываю предметы на основе рассчитанного размера шрифта. Вот код, с которым я пошел...
Реализация...
private void Reorder()
{
var tempList = new LinkedList<DisplayTag>();
bool even = true;
foreach (var tag in this) {
if (even)
tempList.AddLast(tag);
else
tempList.AddFirst(tag);
even = !even;
}
this.Clear();
this.AddRange(tempList);
}
Тест...
[TestCase(DisplayTagOrder.SmallestToLargest, Result=new[]{10,14,18,22,26,30})]
[TestCase(DisplayTagOrder.LargestToSmallest, Result=new[]{30,26,22,18,14,10})]
[TestCase(DisplayTagOrder.LargestInTheMiddle, Result = new[] { 10, 18, 26, 30, 22, 14 })]
[TestCase(DisplayTagOrder.LargestOnTheEnds, Result = new[] { 30, 22, 14, 10, 18, 26 })]
public int[] CalculateFontSize_Orders_Tags_Appropriately(DisplayTagOrder sortOrder)
{
list.CloudOrder = sortOrder;
list.CalculateFontSize();
var result = (from displayTag in list select displayTag.FontSize).ToArray();
return result;
}
Использование...
public void CalculateFontSize()
{
GetMaximumRange();
GetMinimunRange();
CalculateDelta();
this.ForEach((displayTag) => CalculateFontSize(displayTag));
OrderByFontSize();
}
private void OrderByFontSize()
{
switch (CloudOrder) {
case DisplayTagOrder.SmallestToLargest:
this.Sort((arg1, arg2) => arg1.FontSize.CompareTo(arg2.FontSize));
break;
case DisplayTagOrder.LargestToSmallest:
this.Sort(new LargestFirstComparer());
break;
case DisplayTagOrder.LargestInTheMiddle:
this.Sort(new LargestFirstComparer());
Reorder();
break;
case DisplayTagOrder.LargestOnTheEnds:
this.Sort();
Reorder();
break;
}
}