繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM