I want to loop through each item in my model in my razor view but I want to group all items together. I then want to loop through each group. Imagine I have a table:
ID GroupNo GroupName
1 1 Group1
2 1 Group2
3 1 Group3
4 2 Group1
5 2 Group2
6 3 Group56
I want to do something like:
@foreach (var group in Model.GroupNo) {
<section>
<header>Group No is @group.GroupNo</header>
@foreach (var item in group) {
<p>GroupName: @item.GroupName</p>
}
</section>
}
So my output is:
Group No is 1
GroupName: Group1
GroupName: Group2
GroupName: Group3
Group No is 2
GroupName: Group1
GroupName: Group2
Group No is 3
GroupName: Group56
Is this possible?
Thanks
Yes, this is easy to do using the Linq GroupBy
. I'd suggest changing your view to use @model IEnumerable<IGrouping<string, MyModel>>
, which you'd populate like this:
var groupModel = MyModelCollection.GroupBy(item => item.GroupNo).ToArray();
return View(groupModel);
Then, simply iterate through the group as you wrote, except using group.Key
instead of group.GroupNo
to retrieve IGrouping's key:
@foreach (var group in Model) {
<section>
<header>Group No is @group.Key</header>
@foreach (var item in group) {
<p>GroupName: @item.GroupName</p>
}
</section>
}
LINQ can help you do that
@model IEnumerable<Project1.Models.Group>
@foreach (var item in Model.Select(i=>i.groupno).Distinct().ToList()) {
<tr>
<td>
<header>Group No is @item</header>
@foreach (var grpName in Model.Where(i => i.groupno == item).ToList())
{
<p>GroupName: @grpName.groupName</p>
}
</td>
</tr>
}
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
@{
String[] name = {"Prashant", "Rishabh", "Zaheer", "Pratima", "Rahul"};
int i = 1;
while (i <= 5)
{
foreach(var x in name)
{
<p>@i. @x</p>
i++;
};
break;
}
}
</div>
</body>
</html>
O/p-
1. Prashant
2. Rishabh
3. Zaheer
4. Pratima
5. Rahul