ILookup商店项目在多个键下

时间:2014-05-30 05:31:03

标签: .net linq indexing lookup ilookup

我有一种情况,我有一组对象,这些对象与数据库中的项目有关。我们创建这些对象的本地缓存以及索引,以允许快速过滤/搜索数据。我遇到的问题是将对象列表转换为查找。

(非常)简化的对象:

String ItemID;
List<String> LocationIDs;

项目可以属于多个位置,每个位置可以包含多个项目。

我想使用LocationID作为键创建查找,以便使用其位置ID获取属于特定位置的项目列表,并且可以在任意数量的位置(查找的键)下找到任何项目

我尝试了以下

items.ToLookup(item => item.LocationIDs);

但这不会返回所需的结果。

理想的用法是:

查找

{
    ["Location 1"] => {
        {Item 1},
        {Item 2},
        {Item 3},
        {Item 9},
    },
    ["Location 2"] => {
        {Item 2},
        {Item 4},
        {Item 3}
    },
    ["Location 3"] => {
        {Item 1},
        {Item 3},
        {Item 7}
    },
    ["Location 4"] => {
        {Item 1},
        {Item 2},
        {Item 10}
    }
}

然后您可以轻松检索给定位置的项目。

感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:4)

假设它需要来自LocationID - &gt; ItemID,一种方式是:

items.SelectMany(item => item.LocationIDs,
                 (item, locationID) => new { item.ItemID, LocationID = locationID })
     .ToLookup(tuple => tuple.LocationID, tuple => tuple.ItemID)

在将 转换为查找之前,首先将所有数据展平为一系列(itemID,locationID)元组。

如果查询需要来自LocationID,那么这是对上述内容的一个微不足道的修改 - &gt;物品对象本身。