获得其中一个

Gui*_*nge 7 c# asp.net-mvc-4

目标

获取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,它只是一个使用示例!)


I4V*_*I4V 7

你需要 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)