如何按双精度小数部分对双精度列表进行排序。
例如:对于输入<1.2, 2.3, 1.12, 5.1>
,在排序后输出
应为<5.1, 1.12, 1.2, 2.3>
答案 0 :(得分:11)
您可以通过OrderBy()
和Math.Truncate
方法实现此目的,如下所示。其中x-Math.Truncate(x)
给出小数点后的数字,OrderBy
将按升序排列。看一下这个example并尝试使用以下代码段
List<double> input = new List<double>(){1.2, 2.3, 1.12, 5.1};
input = input.OrderBy(x=>x-Math.Truncate(x)).ToList();
Console.WriteLine(String.Join("\n",input));
或者您也可以尝试.OrderBy(x=>x-(int)x)
代替OrderBy(x=>x-Math.Truncate(x)
答案 1 :(得分:1)
List
有Sort()
IComparer<T>
方法,该方法采用public class MantissaComparer : IComparer<double>
{
public int Compare(double x, double y)
{
return Comparer<double>.Default.Compare(x - Math.Truncate(x), y - Math.Truncate(y));
}
}
的实例。 overload很容易实现,并允许您按照您想要的任何方法进行排序:
input.Sort(new MantissaComparer());
然后使用这样的自定义比较器:
linq
我看到{{1}}标记,但如果您认为有必要,此解决方案在整个代码中更可重用,同时避免&#34;过度工程&#34;由于简单的IComparer&#39;接口
答案 2 :(得分:1)
您也可以在不使用Math.Truncate
var sortedlist = list.OrderBy(n => n - (int)n).ToList();
Console.Write(String.Join(",", sortedlist));