我有一个 for 循环,它循环一个交易列表,其中都包含金额。如果金额正确,我希望该交易包含在新列表中。
所以在代码中:
decimal searchAmount = 33.03;
foreach (var order in listOforders)
{
if(order.amount == searchAmount)
{
addOrderToList()
}
}
使用的货币使用的小数点不超过两位,所以没关系。这三种情况都应将顺序添加到列表中。
order.Amount = 33.03
search.Amount = 33
order.Amount = 33.03
search.Amount = 33.03
order.Amount = 33.99
search.Amount = 33.9
注意:
这是一个搜索。当客户回来并说"我购买的产品有问题,并且不是在注册客户处购买的"时,在客户银行收据上搜索金额是一项很棒的功能。这是一个零售实体店方案,因此一些客户选择不注册自己。
如果要完全放弃小数部分,请使用 LINQ 和 Math.Truncate
的组合
var orders = listOfOrders.Where(o => Math.Truncate(o.amount) == Math.Truncate(searchAmount))
.ToList();
Math.Truncate
返回给定小数的整数部分,Where
仅选择适当的顺序(如果您不知道,请阅读 LINQ 的延迟执行),ToList
将查询具体化为列表。
鉴于您的编辑,这可能是您正在寻找的:
var orders
= listOfOrders.Where(
o => Math.Truncate(o.amount) == Math.Truncate(searchAmount)
&& o.amount.ToString(CultureInfo.InvariantCulture)
.StartsWith(searchAmount.ToString(CultureInfo.InvariantCulture)))
.ToList();
这首先验证数字的整数部分是否匹配,然后使用字符串比较来检查实际金额是否以输入的内容(由懒惰用户)开始。
像这样使用 if 条件。四舍五入到小数点后 2 位并进行比较。
if((Math.Round(order.amount,2) - Math.Round(searchAmount,2)) <= 0.9M)
{
addOrderToList();
}
如果你使用Math.Truncate(number)
怎么办?就像:
if(Math.Truncate(order.amount) == Math.Truncate(searchAmount))
是对的,你需要定义一些最大差分常数并使用它类似的东西
decimal maxDiff = 0.03;
decimal searchAmount = 33.03;
var result = listOfOrders.Where(o => Math.Abs(o.Amount - searchAmount) <= maxDiff);
您需要使用Math.Floor
方法来匹配所有数字,即绝对值
decimal searchAmount = 33.03;
var temp = Math.Floor(searchAmount);
foreach (var order in listOforders)
{
if(Math.Floor(order.amount) == temp)
{
addOrderToList()
}
}
不需要任何对Math
的调用,因为演员int
也会这样做。您的代码可以更改为;
int searchAmount = 33;
listOforders.Where(o => (int)o.Amount == searchAmount)
.ForEach(o => addOrderToList());