将字符串转换为int,根据foreach循环检查int的总和

时间:2017-04-17 17:48:14

标签: c# linq templates razor

我在这里看到了类似的问题,但它们似乎都非常具有语境性,到目前为止,我已经很难解决这个问题了。如果这是一个重复的问题或者非常简单,那么对于C#和剃刀模板来说仍然是新手,所以道歉!

我要做的是在foreach循环中获取用户定义字符串的值,将其转换为(我假设)一个int,为每个循环实例添加它,然后检查总和的财产。

这是一个愚蠢的代码示例,可能会更清楚:

foreach (var col in columnOptions.Columns) 
{
    <div class="@col.Width">
        @*content*@
    </div>  
}
if (totalWidthValue > 12) 
{
    @*do something else*@
}

所以基本上我需要取col.Width的值,将其转换为int,以便可以计算,将每次出现的总和相加,然后检查总数是否大于12。

此外,如果它有帮助,这是设置宽度的位置/方式:

[JsonSchema(Title = "Column width", Description = "Select the width of this column based on a 12 column wide grid")]
[PropertyOrder(11)]
[JsonOptions(GridColumns = 6)]
[JsonEnumValues("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12")]
[DefaultValue("12")]
[Localizable(false)]
public string Width { get; set; }

编辑: 以下是我可以根据我的尝试提供的内容,我担心它可能没有完全形成以确定任何特定的“这里你出错了”,但至少它显示了一个尝试,并可能给我的知识差距的地方提供了一些背景是(添加的部分实际上只是两个变量):

    foreach (var col in columnOptions.Columns) 
    {

        var colNum = double.TryParse(col.Width, out colNum);
        var totalWidthValue = colNum + colNum;

        <div class="@col.Width">
            @*content*@
        </div>  
    }
    if (totalWidthValue > 12) 
    {
        @*do something else*@
    }

1 个答案:

答案 0 :(得分:1)

对于您的尝试:问题是使用TryParse它会返回bool并且具有out参数。然后累积总和使用+=。所以不要这样:

var colNum = double.TryParse(col.Width, out colNum);
var totalWidthValue = colNum + colNum;

有这样的事情:

double colNum;
if(double.TryParse(col.Width, out colNum))
    totalWidthValue += colNum;

使用linq&#39; .Sum执行此操作:

int desiredWidth = 12;
if(columnOptions.Columns.Sum(col => int.Parse(col.Width)) > desiredWidth)
{
    /*  ... */
}

如果您不确定宽度是否为有效的int,您可以执行与this answer中第二个代码snipet类似的操作:

Func<string, int, int> parseIntOrDefault = (input, defaultValue) =>
{
    int value = defaultValue;
    int.TryParse(input, out value);
    return value;
};

columnOptions.Columns.Sum(col => parseIntOrDefault(col.Width,0)))