我被这个问题困扰了一段时间。我想获取一个列表并对其进行排序,以使价格最高的产品最终位于列表的中间。我也想做相反的事情,即确保价格最高的项目最终位于列表的外边界。
想象这样一个数据结构.. 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;
}
}
最佳答案
LinkedList
是合适的数据结构,因为它允许您高效地向任一端添加:
LinkedList<int> result = new LinkedList<int>();
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Array.Sort(array);
bool odd = true;
foreach (var x in array)
{
if (odd)
result.AddLast(x);
else
result.AddFirst(x);
odd = !odd;
}
foreach (int item in result)
Console.Write("{0} ", item);
没有额外的复制步骤,没有反向步骤,......每个节点的存储开销很小。
关于c# - 在 C# 中,如何对 "largest"值位于列表中间的列表中的项目进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3796520/