linq 如何从列表中获取具有最大小数位的值

nfg76nw0  于 2023-09-28  发布在  其他
关注(0)|答案(2)|浏览(109)
List<decimal> list = new List<decimal>() { 23.346m, 23.56m, 4.2m, 0.90000000000000000000000000000m, 0.59333800m};

Console.WriteLine(list.OrderByDescending( a=>a)
.Max());

我如何对这个列表进行排序,并获得.之后数字最大的值?
预期结果:
像这样排序
//0.593338m
//23.346m
//23.56米
//4.2米
//0.9米
预期的最长值为:
//0.593338m

qxsslcnc

qxsslcnc1#

不如这样吧:

List<decimal> list = new List<decimal>() { 23.346m, 23.56m, 4.2m, 0.90000000000000000000000000000m, 0.59333800m};
List<string> lists = list.Select(x => x.ToString("0.##############################")).ToList();
Console.WriteLine(lists.OrderByDescending( a=>a.Substring(a.IndexOf('.')).Length).Max());

首先将列表转换为字符串列表-格式字符串需要从小数的字符串版本中删除尾随的零,因为它们将保留定义时使用的精度。#格式说明符向右截断0,需要29个#,因为这是十进制可以具有的最高精度。
然后按字符串的长度排序小数点后的字符串。

jckbn6z7

jckbn6z72#

您可以使用纯数学来获得所需的结果,这比字符串转换更有效,但解决小数点分隔符后的右侧并将其转换为整数是棘手的。
通过以下方法,查询结果很容易:

decimal result = list.MaxBy(GetValueAfterDecimalSeparator);
public static int GetValueAfterDecimalSeparator(decimal d)
{
    decimal normalized = Normalize(d); // remove trailing zeros
    int countDecimalNumbers = BitConverter.GetBytes(decimal.GetBits(normalized)[3])[2];
    decimal leftValue = System.Math.Floor(normalized);
    decimal rightValue = Math.Abs(leftValue - normalized);
    try
    {
        int multiplier = (int)Math.Pow(10, countDecimalNumbers);
        return Decimal.ToInt32(Decimal.Multiply(rightValue, multiplier));
    }
    catch(OverflowException)
    {
        return int.MaxValue;
    }
}
    
public static decimal Normalize(decimal value)
{
    return value/1.000000000000000000000000000000000m;
}

Normalize方法来自here

相关问题