我有一個列表包含範圍[-1,1]中的多個值,我想從0到1,然後從0到-1排序它們。C#列表排序與多個範圍
例如:0.0,0.25,0.9,1.0,-0.1,-0.24,-0.85
我怎麼能做到這一點,也許使用IComparable的?我想避免使用LINQ。
我有一個列表包含範圍[-1,1]中的多個值,我想從0到1,然後從0到-1排序它們。C#列表排序與多個範圍
例如:0.0,0.25,0.9,1.0,-0.1,-0.24,-0.85
我怎麼能做到這一點,也許使用IComparable的?我想避免使用LINQ。
您可以使用Sort overload接受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
的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版本會在你要求的時候創建一個副本)。
爲什麼你想避免的LINQ?另外,'-85'在你的列表中,那裏會出現? – DavidG
所以你需要檢查一個值是否定的,然後按絕對值排序? –
零去哪裏? – DavidG