c# - 在 C# 中,如何对 "largest"值位于列表中间的列表中的项目进行排序

标签 c# linq list

我被这个问题困扰了一段时间。我想获取一个列表并对其进行排序,以使价格最高的产品最终位于列表的中间。我也想做相反的事情,即确保价格最高的项目最终位于列表的外边界。

想象这样一个数据结构.. 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/

相关文章:

c# - 使用 CheckBox bool 值的评分函数

c# - 如何从代码中监控内存分配

c# - 匹配列表中的整数

linq - 分解 linq 查询中的表达式

c# - 使用 Linq 从树中获取具有特定属性的所有对象

c# - 按属性获取元素过滤

c# - 3 种快速排序算法

python - 如何将两个日期列表合并为一系列日期间隔?

python - 交换列表中的最大值和最小值

Java获取List中的数组