【问题标题】:C# How do I add the Value of a Dictionary to a variable based on its Key?C#如何将字典的值添加到基于其键的变量中?
【发布时间】:2019-03-25 20:07:38
【问题描述】:

我必须根据用户使用字典的输入来计算订单的价格,但我似乎无法正确计算。

  1. 鸡肉条 - 3.50 美元
  2. 炸薯条 - 2.50 美元
  3. 汉堡包 - 4.00 美元
  4. 热狗 - 3.50 美元
  5. 大杯饮料 - 1.75 美元
  6. 中杯饮料 - 1.50 美元
  7. 奶昔 - 2.25 美元
  8. 沙拉 - 3.75 美元
  9. 小杯饮料 - 1.25 美元

例如,如果输入是236,那么订单的价格应该是$8。

将我的 LINQ 查询转换为 double 不起作用(我的查询也肯定是错误的)。 我真的不知道任何 LINQ,但由于您不能真正为字典使用 for 循环,因为它们没有被索引,所以我真的别无选择。

        Dictionary<int, double> items = new Dictionary<int, double>()
        {
            { 1, 3.50 },
            { 2, 2.50 },
            { 3, 4.00 },
            { 4, 3.50 },
            { 5, 1.75 },
            { 6, 1.50 },
            { 7, 2.25 },
            { 8, 3.75 },
            { 9, 1.25 }
        };

        string order = Console.ReadLine();
        double sum = 0;
        for (int i = 0; i < order.Length; i++)
        {
            sum += Convert.ToDouble(items.Where(x => x.Key == int.Parse(order[i].ToString())).Select(x => x.Value));
        }
        Console.WriteLine(sum);
        Console.ReadKey();

嗯,输出应该是基于用户输入的正确金额。

【问题讨论】:

  • sum += items[order[i]-'0']; ?
  • 真的这么简单吗?你能详细说明 -'0' 部分吗?我不明白。
  • double sum = order.Sum(ch =&gt; items[ch-'0']); - Select 从输入 order 字符串返回每个 (ASCII) 字符,它们从值为 48-57 的字节运行(其中 48 是 0)所以减去基值 0 以获取 1 - 9 之间的数字。请注意,这假定一个 ASCII/类似字符集,其中数字是连续的和升序的。您可以使用 order.Where(ch =&gt; Char.IsDigit(ch))... 忽略坏字符。
  • 感谢您的解释!

标签: c# .net linq dictionary console-application


【解决方案1】:

不需要循环。

var sum = order.Sum(c => items[int.Parse(c.ToString())]);

【讨论】:

  • 既然可以使用Sum(c =&gt; ),为什么还要使用Select().Sum()
  • ^ 没错,它在开始时只使用 Sum(),根本不使用 Select()。所以我最喜欢的最终解决方案是:double sum = order.Sum(x => items[int.Parse(x.ToString())]);
  • @NetMage 注意到了!
【解决方案2】:

这个实现非常脆弱,它只允许 10 个项目并且依赖于字符串解析,但我认为以下代码可以满足您的要求:

order.Sum(character =>
{
    int id = character - '0';

    return items.TryGetValue(id, out double price) ? price : 0d;
});

TryGetValue 检查order 仅包含作为项目字典中的键的数字。

【讨论】:

    【解决方案3】:

    试试这个

    order.Select(c => (c - '0')).Where(c => c > 0 && c < 10).Sum(c => items[c])
    

    【讨论】:

    • 建议在转换为数字之前使用Char.IsDigit。然后只需使用Sum(c =&gt; items[c-'0']),不需要Select 两次。
    • @NetMage IsDigita bit broader 而不是 [0-9] 并且需要 proper conversion 使用 char.GetNumericValue()。但确实它会作为家庭作业很酷:)
    • @NetMage 关于不必要的最后选择,您是对的,我修复了我的解决方案。谢谢!
    【解决方案4】:

    您可以在 for 循环中使用 sum += items[order[i]-'0'];

    这是有效的,因为 '0' 与值 48 一起存储(请参阅this question 的答案)。其余数字按顺序存储('1' 是 49,'2' 是 50,等等),所以 '1' - '0' == 1 等等。

    【讨论】:

    • 我想您也需要将第二句话作为代码中的注释,以了解它在做什么。我会坚持int.Parseany day。
    • 也许这是我的 C/C++ 背景,但我觉得每个程序员至少应该对字符编码了解很多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多