在c#中,如何按尾数对双打列表进行排序?

时间:2017-05-17 03:57:41

标签: c# .net linq

如何按双精度小数部分对双精度列表进行排序。
  例如:对于输入<1.2, 2.3, 1.12, 5.1>,在排序后输出          应为<5.1, 1.12, 1.2, 2.3>

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)

ListSort() 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));