代码之家  ›  专栏  ›  技术社区  ›  Gayathri Mohan

在一个数组中计算Razor,Umbraco中的许多相同值的项

  •  -3
  • Gayathri Mohan  · 技术社区  · 7 年前

    我有一系列的记录

    Model.Categories = ["apple", "banana", "apple", "orange"]
    

    从这个数组中,我将逐个显示记录

     @foreach (var category in Model.Categories)
                {
                    <a href="@Url.ArticulateCategoryUrl(Model, category)">@category</a>                   
                }
    

    所以现在显示两次苹果记录,但我想显示一次,旁边的计数如下

    apple -(2)
    banana
    orange
    

    像这样可以帮我在剃须刀上这个怎么实现?

    3 回复  |  直到 7 年前
        1
  •  1
  •   trinadh    7 年前

    为此,我们需要在模型中创建一个方法,该方法将返回一个类别字典及其出现次数。请找到下面的方法,可以用来返回字典。

    public Dictionary<string,int> CountArray()
        {
            Dictionary<string, int> countArr = new Dictionary<string, int>();
    
            foreach (var category in Categories)
            {
                if(countArr.ContainsKey(category))
                {
                    countArr[category] = countArr[category] + 1;
                }
                else
                {
                    countArr[category] = 1;
                }
            }
            return countArr;
        }
    

    现在在cshtml文件中创建一个变量并分配这个从模型返回的值。 在foreach循环中使用此变量。 我想这能帮你解决问题。

    我真的不建议这样做。但如果你需要帮助,请找到剃刀代码。

    @{ Dictionary<string, int> countarry = new Dictionary<string, int>();}
    @foreach (var category in Model.Categories)
    {
        if (countarry.ContainsKey(category))
        {
            countarry[category] = countarry[category] + 1;
        }
        else
        {
            countarry[category] = 1;
        }
    }
    @foreach (var categoryName in countarry.Keys)
                {
    if(countarry[categoryName] > 1)
            <a href="@Url.ArticulateCategoryUrl(Model, categoryName)">@categoryName - (@countarry[categoryName])</a>
    else
    <a href="@Url.ArticulateCategoryUrl(Model, categoryName)">@categoryName</a>
        }
    

    我希望这是你所期望的。

        2
  •  0
  •   Hira Kumar Maharjan    7 年前

    我有个简单的解决办法

    var fruits = ["apple","coconut","apple","banana","papaya"];
    

    变量sortfruits=[]; (水果的果实){

    if(sortFruits.includes(fruit)==false){
        sortFruits.push(fruit);
    }
    

    } 控制台日志(sortfruits);

        3
  •  0
  •   Yas Ikeda    7 年前

    不确定它是否像你所说的那样是“剃须刀代码”,但为什么不使用linq groupby呢?

    以下代码将在浏览器上生成预期的输出。

    @foreach (var category in categories.GroupBy(k => k))
    {
        <a>@category.Key@(category.Count() > 1 ? $" - ({category.Count()})" : "")</a><br/>
    }
    

    上面的例子适用于Razor3.0.0.0和.NET Franwork4.6.1(C 6.0)

    上面的代码是在尝试按问题中的预期输出后得到的结果。如果使它更简单,它可能在早期版本中工作。

    @foreach (var category in categories.GroupBy(k => k))
    {
        <a>@category.Key - @category.Count()</a><br/>
    }