Подсчитайте в массиве одно и то же значение предметов в Razor, Umbraco - PullRequest
0 голосов
/ 07 июня 2018

У меня есть массив записей

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

из этого массива. Я отображаю записи одну за другой

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

, так что в данный момент отображается запись Apple дважды, но я хочучтобы отобразить один раз с таким количеством, как это

apple -(2)
banana
orange

, как это может помочь мне в этом на Razor, как это реализовать?

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

У меня есть простое решение

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

var sortFruits = [];for (фрукт из фруктов) {

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

} console.log (sortFruits);

0 голосов
/ 07 июня 2018

Не уверен, что это может быть "код Razor" при вызове, но почему бы вам не использовать Linq GroupBy?

Следующий код дает ожидаемый результат в браузере.

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

Пример выше работает в Razor 3.0.0.0 и .Net franework 4.6.1 (C # 6.0)

Приведенный выше код является результатом после попытки вывода, как и ожидалось в вопросе.Если сделать его проще, возможно, он мог бы работать в более ранних версиях.

@foreach (var category in categories.GroupBy(k => k))
{
    <a>@category.Key - @category.Count()</a><br/>
}
0 голосов
/ 07 июня 2018

Для этого нам нужно создать метод в модели, который будет возвращать словарь категории и его вхождение.Найдите приведенный ниже метод, который можно использовать для возврата словаря.

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>
    }

Я надеюсь, что это то, что вы ожидаете.

...