我有一个包含[-1,1]范围内多个值的列表,我希望将它们从0到1然后从0到-1进行排序。
Ex:0.0,0.25,0.9,1.0,-0.1,-0.24,-0.85
我怎么能这样做,也许使用IComparable?我想避免使用LINQ。
答案 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