在xml标记的多个元素中平均分配百分比

时间:2016-05-17 06:28:32

标签: c#

我正在修改具有各种百分比值的XML文件。单个XML文件中有多个元素。我有一个特定元素的百分比,我需要将剩余的百分比分配给剩余的元素。下面是我存储在服务器中的示例XML文件。

<exam>
    <name>Maths</name>
    <percentage>100</percentage>
</exam>
<exam>
    <name>Physics</name>
    <percentage>70</percentage>
</exam>
<exam>
    <name>Chemistry</name>
    <percentage>70</percentage>
</exam>

我有一个特定主题的百分比值。例如,我有数学的百分比值,我通过硬编码用下面的代码更新了数学的百分比值。

foreach (XElement xmltag1 in xmltag.Descendants(subsection))
{
    if (xmltag1.Element("name").Value.Equals("Maths")) 
    {   
        xmltag1.Element("percentage").Value = "75";
    }
}

现在我需要用整数而不是小数更新物理和化学的剩余主题的百分比值。所以我正在使用以下逻辑。

int totalsections = subclasscount;
// subclass count is a method which would return the total number of subclasses inside a particular xml tag. I have that method available with me
int remainingallocatedpercentage = 25 / totalsections;
foreach (XElement xmltag1 in xmltag.Descendants(subsection))
{
    if ((remainingallocatedpercentage % 1) == 0)
    {
        if (!xmltag1.Element("name").Value.Equals("Maths"))
        {                                                       
             xmltag1.Element("percentage").Value = remainingallocatedpercentage;
        }
    }
    else
    {
    }         
}

我不太确定如何处理else路径。所以我需要逻辑来实现它。我想告诉你,我不知道还有哪些其他学科价值(像物理学,化学这里有多个动态而非静态的学科)所以我需要在所有科目中平均分配剩余的百分比。

1 个答案:

答案 0 :(得分:0)

首先,这段代码不起作用,因为int remainingallocatedpercentage = 25 / totalsections;将始终获得整数值。相反,你可以这样做:

var remainingallocatedpercentage = 25 / (float)totalsections;

应用此功能后,您现在有机会陷入代码的else状态。

然后你的实际问题就开始了。但必须有一个策略来处理这种情况。在else案例中,您可以采用以下方法:

  1. 只需将浮点数的最低值设置为其他类值即可。这很简单:

    xmltag1.Element("percentage").Value = remainingallocatedpercentage;
    
  2. 设置除最后一个之外的所有人的楼面值,并将剩余部分设置为最后一个。这有点乏味:

    if(!xmltag1.Element("name").Value.Equals(xmltag.Descendants(subsection).LastOrDefault().Element("name").Value))
    {
        xmltag1.Element("percentage").Value = remainingallocatedpercentage;
    }
    else
    {
        xmltag1.Element("percentage").Value = remainingallocatedpercentage + 1;
    }
    
  3. 我不知道哪种方法适合你,但由于你有这个整数约束,你没有太多机会。