C#列出多个范围的排序

时间:2017-08-04 15:14:20

标签: c# list sorting

我有一个包含[-1,1]范围内多个值的列表,我希望将它们从0到1然后从0到-1进行排序。

  

Ex:0.0,0.25,0.9,1.0,-0.1,-0.24,-0.85

我怎么能这样做,也许使用IComparable?我想避免使用LINQ。

2 个答案:

答案 0 :(得分:3)

LINQ方式就是这样做(假设你想得到一个排序的数组,不需要ToArray位):

var sorted = values.OrderBy( value => value < 0 ).ThenBy( Math.Abs ).ToArray();

我显示的唯一原因是你可以将它与使用比较器的非LINQ方法进行比较:

public class MyComparer : IComparer<double>
{
    public int Compare( double x, double y )
    {
        if( x < 0 )
        {
            if( y >= 0 ) return 1;
            return -x.CompareTo( y );
        }
        else
        {
            if( y < 0 ) return -1;
            return x.CompareTo( y );
        }
    }

    public static MyComparer Instance{ get; } = new MyComparer();

    private MyComparer() {}
}

然后使用它:

Array.Sort( values, MyComparer.Instance);

关键是它需要更多的代码(还有更多地方可以搞砸比较)。这也会对数组进行排序(如果你要求,LINQ版本将在其中进行复制)。

答案 1 :(得分:1)

您可以使用排序重载接受Comparison。 这应该有效:

public static int MyCompare(double x, double y)
{
    if (x >= 0.0 == y>=0.0)
        // same sign, compare by absolute value
        return Math.Abs(x).CompareTo(Math.Abs(y));

    if (x < 0.0)
        return 1;

    return -1;
}

用法:

var list = new List<double>();
// fill your list
// call sort using the Comparison

// hard syntax
//list.Sort((x,y) => MyCompare(x, y));

// easy syntax :)
list.Sort(MyCompare);

foreach (var x in list)
    Console.WriteLine(x);

在工作中看到它:https://dotnetfiddle.net/odOJYh