[英]In c#, how to sort list of doubles by mantissa?
如何按双精度的小数部分对双精度列表进行排序。
例如:对于输入<1.2, 2.3, 1.12, 5.1>
,在排序后,输出应<5.1, 1.12, 1.2, 2.3>
您可以通过OrderBy()
和Math.Truncate()
方法实现此Math.Truncate()
,如下所示。 其中x-Math.Truncate(x)
给出小数点后面的数字, OrderBy
将按升序排列它们。 看一下这个例子 ,尝试使用以下代码片段
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)
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));
}
}
然后像这样使用自定义比较器:
input.Sort(new MantissaComparer());
我看到了linq
标签,但是如果你认为有必要,这个解决方案在你的代码中更可重用,同时避免由于简单的'IComparer'接口而导致的“过度工程”。
您也可以在不使用Math.Truncate
情况下尝试以下Math.Truncate
var sortedlist = list.OrderBy(n => n - (int)n).ToList();
Console.Write(String.Join(",", sortedlist));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.