7

目標

によって返された各結果の 1 つを取得しforeachます。

シナリオ

次の Razor のコード フラグメントを見てください。

@foreach (var product in Model.Collection.Products)
{
    <p>@product.name</p>
}

クライアントへのリターンは次のとおりです。

Xbox360

Xbox360

Xbox360

Xbox360

プレイステーション3

プレイステーション3

プレイステーション3

さて、説明しましょう。私のアプリケーションは、さまざまな店舗の商品の価格を比較します。私の場合、Xbox 360 は 4 つのストアにあり、Playstation 3 は 3 つのストアに存在します。そのため、これらの名前が繰り返されます。

私が求めているのは単純です: 各製品の名前を 1 回だけ取得して、HTML の表の列に入力します — 理解できますか?

哲学

各製品はセッションに追加されます。この場合、セッションには 2 つの製品があります。1 つ目はXbox 360で、2つ目はPlaystation 3です。したがって、ご覧のとおり、Session を使用してこれを操作できます(「Session の各項目に対して、何かを実行します...」)が、常にクエリを実行する必要があるため、必要ではないと思いますデータベースであり、ロジックにより、必要なものが返されます。つまり、ユーザーが必要とするものを一時的に保存する以外に、セッションを使用する必要はありません。

スポットライト

Model.Collection.ProductsタイプList<Products>です。

私は何を試しましたか?

このようなもの:

@foreach (var product in Model.Collection.Products.FirstOrDefault())
{
    [...]
}

しかし、もちろん、失敗しました。基本的に私はのようなものが必要ですFirstOfEach()

4

5 に答える 5

12

ソリューション

使用GroupBy...

@foreach (var group in Model.Collection.Products.GroupBy(x => x.name))
{
    <p>@group.Key</p>
}

Aは、プロパティがグループ化するプロパティの値を表すGroupByを返します (この場合: )IEnumerable<IGrouping<TKey, TSource>>Keyname


他の利点

このアプローチの利点は、各グループのアイテムにもアクセスできることです。たとえば、グループごとに異なる価格をリストしたい場合は、次のようにすることができます。

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

(これが最適な HTML ではないことはわかっています。使用例にすぎません!)

于 2013-08-06T14:50:00.217 に答える
7

あなたが必要DistinctBy

@foreach (var product in Model.Collection.Products.DistinctBy(p=>p.name))

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)));
    }
}
于 2013-08-06T14:50:34.853 に答える
1

個別の製品名だけが必要な場合は、コレクションから個別のリストを抽出できます。

@foreach (var productName in Model.Collection.Products.Select(p=>p.Name).Distinct())
{
    <p>@productName</p>
}
于 2013-08-06T14:52:40.710 に答える
0

GroupBy と同様に、リストを Lookup に変換することもできます

Model.Collection.Products.ToLookup(x => x.name))
于 2013-08-06T15:01:59.677 に答える