获取a返回的每个结果之一foreach.
看看下面的Razor代码片段:
@foreach (var product in Model.Collection.Products)
{
<p>@product.name</p>
}
Run Code Online (Sandbox Code Playgroud)
返回客户端是:
Xbox 360
Xbox 360
Xbox 360
Xbox 360
Playstation 3
Playstation 3
Playstation 3
现在,让我解释一下:我的应用程序比较了不同商店的产品价格.就我而言,四个商店中有Xbox 360,而三个商店中存在Playstation 3 - 这就是他们的名字重复的原因.
我想要的很简单:只需一次填写每个产品的名称来填充HTML的表格栏 - 你们都能理解吗?
每个产品都在Session上添加.在我们的例子中,会议有两种产品 - 第一种是产品Xbox 360,第二种是产品Playstation 3.所以,正如你所看到的,我可以使用Session来处理这个问题("对于Session上的每个项目,做一些事情......"),但我认为没有必要,因为我总是必须在数据库,按逻辑,它返回我需要的东西.换句话说,除了临时存储用户需要的内容之外,我不需要使用会话.
该Model.Collection.Products是类型List<Products>.
像这样的东西:
@foreach (var product in Model.Collection.Products.FirstOrDefault())
{
[...]
}
Run Code Online (Sandbox Code Playgroud)
但是,当然不成功.基本上我需要类似的东西FirstOfEach().
mus*_*fan 12
解决方案
用GroupBy......
@foreach (var group in Model.Collection.Products.GroupBy(x => x.name))
{
<p>@group.Key</p>
}
Run Code Online (Sandbox Code Playgroud)
一个GroupBy将返回一个IEnumerable<IGrouping<TKey, TSource>>在Key属性表示你是通过分组属性的值(在这种情况下:name)
其他福利
这种方法的好处是您还可以访问每个组的项目,因此,如果您想列出每个组的不同价格,例如,您可以执行以下操作:
@foreach (var group in Model.Collection.Products.GroupBy(x => x.name))
{
<p>Product: @group.Key (@group.Count() items)</p>
<p>Prices:
@foreach(var item in group)
{
<span>@item.price</span>
}
</p>
}
Run Code Online (Sandbox Code Playgroud)
(我知道这不是最好的HTML,它只是一个使用示例!)
你需要 DistinctBy
@foreach (var product in Model.Collection.Products.DistinctBy(p=>p.name))
Run Code Online (Sandbox Code Playgroud)
public static partial class MyExtensions
{
public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> source, Func<T, TKey> keySelector)
{
HashSet<TKey> knownKeys = new HashSet<TKey>();
return source.Where(x => knownKeys.Add(keySelector(x)));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |