【问题标题】:Using ArrayList in C# to create a calculator type web application在 C# 中使用 ArrayList 创建计算器类型的 Web 应用程序
【发布时间】:2013-11-09 22:48:10
【问题描述】:

我需要使用 ArrayList 为网页制作计算器类型的应用程序。计算器根据几个不同的事情计算用户燃烧了多少卡路里。

用户可以在三个文本框中输入值。它们被标记为:活动、体重和持续时间。在活动框中,用户输入活动(划独木舟、钓鱼、打高尔夫球、打猎、跑步或步行)。在重量框中,用户输入重量。持续时间是用户以分钟为单位执行所选活动的时间。根据输入的重量,每项活动都会消耗不同数量的卡路里。例如,如果用户为活动输入 Canoeing,为体重输入 120,为时间输入 60,则所需的输出将是 236 卡路里燃烧。但是,如果用户输入 150 作为权重,结果将是 281。

这有点令人困惑,但基本上燃烧的卡路里取决于人的体重。这三个范围是 0-130、131-155、156-180 和 181-205。

谁能帮帮我?我知道这可能很难理解,所以如果有什么需要澄清的,请告诉我。我将在下面发布到目前为止的代码:

<%@ Page Language="C#" %>

<!DOCTYPE html>

<script runat="server">

    ArrayList rangeSmallest = new ArrayList();
    ArrayList rangeSmall = new ArrayList();
    ArrayList rangeBig = new ArrayList();
    ArrayList rangeBiggest = new ArrayList();
    ArrayList activity = new ArrayList();

void Page_Load()
    {

        rangeSmallest.Add(236);
        rangeSmallest.Add(177);
        rangeSmallest.Add(266);
        rangeSmallest.Add(295);
        rangeSmallest.Add(472);
        rangeSmallest.Add(148);

        rangeSmall.Add(281);
        rangeSmall.Add(211);
        rangeSmall.Add(317);
        rangeSmall.Add(352);
        rangeSmall.Add(563);
        rangeSmall.Add(176);

        rangeBig.Add(327);
        rangeBig.Add(245);
        rangeBig.Add(368);
        rangeBig.Add(409);
        rangeBig.Add(654);
        rangeBig.Add(204);

        rangeBiggest.Add(372);
        rangeBiggest.Add(279);
        rangeBiggest.Add(419);
        rangeBiggest.Add(465);
        rangeBiggest.Add(745);
        rangeBiggest.Add(233);

        activity.Add("Canoeing");
        activity.Add("Fishing");
        activity.Add("Golfing");
        activity.Add("Hunting");
        activity.Add("Running");
        activity.Add("Walking");
    }

    void btnSubmit_Click(object sender, EventArgs e)
{



}

</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
 Activity:   <asp:TextBox ID="txtActivity" runat="server" /><br />
 Weight: <asp:TextBox ID="txtWeight" runat="server" /><br />
 Duration (in minutes): <asp:TextBox ID="txtDuration" runat="server" /><br />
<asp:Button ID="btnSubmit" runat="server" Text="Calories Burned"
    OnClick="btnSubmit_Click" />
<asp:Button ID="btnReset" runat="server" Text="Reset" />
        <asp:Label ID="lblCaloriesBurned" runat="server" />
    </div>
    </form>
</body>
</html>

【问题讨论】:

  • 现在是 2013 年。请不要再使用ArrayList。它属于 C# 没有 泛型 的旧时代。您可以改用List&lt;T&gt;
  • 我不明白这个问题到底是什么。另外,当您可以创建一个包含名称和其他详细信息的对象(“ExerciseActivity”)时,为什么还要使用多个集合?你可以只拥有一个 Collection 和更简洁的代码。
  • 我知道 ArrayList 本质上已经过时了,但我需要将它用于分配,我想我只是想要一些帮助来理解它背后的逻辑。感谢您的回复。

标签: c# asp.net arraylist


【解决方案1】:

使用 ArrayLists(因为它是专门要求的。这绝不是最佳实践,也没有使用 OOP)。我尽量保持简单

public double CalculateCalories(string text, double mass, double time)
{
    int index = -1;

    //First we find the index we're interested in
    for(int i=0; i < activity.count; i++)
    {
        string act = activity[i].ToString();

        //If we match the string perfectly, then we know the index
        if (act.Equals(text))
        {
            index = i;
        }

    }

    if (index.Equals(-1))
    {
        //error - throw some sort of exception
    }

    //Now that we know the index, we'll determine which arrayList we look for

    double calorieCount  = 0;

    if (mass < 130)
    {
        //take from the small one
        calorieCount = rangeSmall[index];
    }
    else if (//Follow the same pattern)
    {
        //
    }

    //Then multiply it by time somehow - depending on how your multiplier is set up

    return time*calorieCount;

}

【讨论】:

    【解决方案2】:

    我将创建一个对象,我将其命名为“ExerciseActivity”

    public class ExerciseActivity
    {
        //Hold the name, and the calorie details in here
        String Name {get;set;}
        double lowCalorieUse {get;set;}
        double mediumCalorieUse {get;set;}
        double highCalorieUse {get;set;}
    
        //Then to calculate it, its pretty easy
    
        public double CalculateCaloriesBurnt(double mass, double time)
        {
    
            double calories = 0;
    
            if (mass < 130)
            {
                calories = lowCalorieUse;
            }
            //the rest is fairly obvious
    
            //...
    
            //Multiply by the time
            return calories * time;
        }
    

    现在在您的主代码中,您使用字典代替...

    Dictionary<string, ExerciseActivity>
    

    然后你可以做一些像这样的好事(注意,你需要检查)

    exerciseDict[txtExerciseName.text].CalculateCaloriesBurnt(mass,time);
    

    (我意识到我超出了最初的要求 - 我不使用 ArrayList - 但这应该更干净。如果您有任何问题,请随时提出)

    【讨论】:

    • 感谢您的回复。有什么方法可以帮助我解决使用 ArrayList 的问题。我知道这是不切实际的,但我的任务就是这样设计的。我真的很想了解它背后的逻辑;我是编码新手。
    【解决方案3】:

    根据我从您的问题中可以推断出,您希望使用活动权重类别索引处的数值。

    所以我猜你有 6 种体重类型,从最重到最轻,然后你选择活动。

    您希望从length 1 中的权重类别返回索引,(因此如果用户选择了第 2 个权重类别,则索引将为 [1],您将返回匹配的 length 类别那个索引。

    话虽如此,我会删除你的代码,并从头开始编写它,使用有意义的PROPER名称,并使用面向对象的方法。

    如果您想了解 ArrayLists,请点击此链接:MSDN official ArrayList documentation

    【讨论】:

      猜你喜欢
      • 2011-04-15
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多