c# - 在列表的上限和下限之间找到一个值

标签 c# linq

我目前正在通过以下方式计算税率

int testValue = 180000;

List<TaxBracket> taxes = new List<TaxBracket>();
taxes.Add(new TaxBracket(18199, 0)); //0 to 18199
taxes.Add(new TaxBracket(36999, 19)); //18200 to 36999
taxes.Add(new TaxBracket(79999, Convert.ToDecimal(32.50D))); //37000 to 79999
taxes.Add(new TaxBracket(179999, 37)); //80000 to 179999 
taxes.Add(new TaxBracket(180000, 47)); //180000

decimal result = taxes[taxes.Count-1].Value;

for (int i = 0; i < taxes.Count; i++)
{
    if (i == 0)
    {
        if (testValue < taxes[i].Limit)
            result = 0;
    }

    if (i > 0)
    {
        if (testValue < taxes[i].Limit && testValue > taxes[i - 1].Limit) 
        {
            result = taxes[i].Value;
        }
    }
}

Console.WriteLine(result);

在 LINQ 中是否有任何替代方法可以代替使用这种老式方法来执行此操作?看起来很接近 this但有点不同。

最佳答案

如果我理解正确,这就是你想要的:

var result = taxes.OrderBy(item => item.Limit)
                  .SkipWhile(item => item.Limit < testValue)
                  .FirstOrDefault()?.Value;

它会将您的集合从最小的 Limit 排序到最大的,然后 Skip 直到达到等于或大于您的 Limit 测试值。因为集合是按 FirstOrDefault 排序的,它是值。

或者:

var result = taxes.Where(item => item.Limit >= testValue )
                  .OrderBy(item => item.Limit)
                  .FirstOrDefault()?.Value;

这种方式从不同的角度看问题。只取等于或等于 testValue 的项,然后对它们排序并取第一个。

关于c# - 在列表的上限和下限之间找到一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38912176/

相关文章:

c# - Visual Studio 2010的Bootstrapper Manifest Generator

c# - 如何获取列表中和不在列表中的项目

c# - 我应该在 SQL 中还是在 LINQ 中执行 Where 子句?

c# - C# 中的 LINQ to SQL 查询

c# - 无法使用类型为“System.Data.Entity.Core.Objects.ObjectQuery”的实例进行调用

c# - CheckedListBoxControl Devexpress C# ---- 将所有项目保存在 MysQL 数据库中

c# - 跨 F#/C# 边界保留字段名称

javascript - 如何在服务器端监听客户端事件

c# - C#如何获取数据表中某列的值?

.net - 比较两个列表以获取同时出现在两个列表中的对象