1

私はMVCプロジェクトに取り組んでいます。foreach反復を使用してビューに表示するには、メニュー項目を4つのグループにグループ化するオブジェクトを返す必要があります。これはビューに渡されるモデルであるため、.cshtmlにバインドできる非ジェネリックコレクションクラスを返す必要があります。

私の考えでは、LINQ内のあるタイプのカウントに基づいてリストをグループ化し、すべての辞書キーに4つの新しいリストアイテムを追加することができます。しかし、辞書に十分な表現は見つかりませんでした。別のメソッドを作成し、コレクションを繰り返してカウントに基づいてキーを割り当てることで、これをかなり簡単に解決できましたが、不要な反復と悪い習慣のようです。

現在、次のクエリを使用しています。

        var itemsDict = rssDataContext.rss_Application_Blog_Category_Relationships
            .Where(x => x.Application_Blog.rss_Application.ID == 1)
            .Where(x => x.Blog_Category_ID == 1)
            .Select(x => new MenuItem
            {
            Name = x.rss_Application_Blog.Blog_Title,
            Uri = x.rss_Application_Blog.Blog_Uri,
            ID = x.rss_Application_Blog.ID
            });

しかし、このクエリを、Dictionary <int、List <MenuItem >>に入力される4つのクラスのグループにグループ化する方法はありますか?

4

2 に答える 2

3

私はあなたがこれを行うことができると思います:

var itemsDict = rssDataContext.rss_Application_Blog_Category_Relationships
    .Where(x => x.Application_Blog.rss_Application.ID == 1)
    .Where(x => x.Blog_Category_ID == 1)
    .Select(x => new { 
        x.rss_Application_Blog.BlogTitle,
        x.rss_Application_Blog.BlogUri,
        x.rss_Application_Blog.ID
    })
    .AsEnumerable() // Do the rest of the query in-process
    .Select((value, index) => new { value, index })
    .ToLookup(pair => pair.index % 4,
              pair => new MenuItem {
                 Name = pair.value.Blog_Title,
                 Uri = pair.value.Blog_Uri,
                 ID = pair.value.ID
              });

Lookupこれはではなく aを返すことに注意してください。ただし、これはDictionary実際には必要なものに近いモデルです。

于 2012-04-16T08:40:51.627 に答える
2

@JonSkeetのソリューションはかなり良いです。GroupByを使用してサブリストを作成し、ToDictionaryを使用してそれらを最終結果に射影する別の実装を次に示します。

var itemsDict = rssDataContext.rss_Application_Blog_Category_Relationships
    .Where(x => x.Application_Blog.rss_Application.ID == 1)
    .Where(x => x.Blog_Category_ID == 1)
    .ToArray()
    .Select((x, index) => new
        {
            Index = index,
            Item = new MenuItem
            {
                Name = x.rss_Application_Blog.Blog_Title,
                Uri = x.rss_Application_Blog.Blog_Uri,
                ID = x.rss_Application_Blog.ID
            }
        });
    .GroupBy(i => i.Index / 4)
    .ToDictionary(g => g.Key);

結果のシーケンスは次のようになります。

items = new Dictionary<int, IGrouping<int>>()
{
    0, new[]
    {
        new { Index = 0, Item = new MenuItem { ... } },
        new { Index = 1, Item = new MenuItem { ... } }
    }
    1, new[]
    {
        new { Index = 2, Item = new MenuItem { ... } },
        new { Index = 3, Item = new MenuItem { ... } }
    }
};
于 2012-04-16T09:04:21.997 に答える