【问题标题】:ILookup store item under multiple keys多个键下的 ILookup 存储项目
【发布时间】:2014-05-30 05:31:02
【问题描述】:

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

(非常)简化的对象:

String ItemID;
List<String> LocationIDs;

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

我想使用 LocationIDs 作为键创建查找,以便我使用其位置 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}
    }
}

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

感谢任何帮助。

谢谢

【问题讨论】:

    标签: .net linq indexing lookup ilookup


    【解决方案1】:

    假设它需要来自 LocationID -> ItemID,一种方法是:

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

    这首先将所有数据扁平化为 (itemID, locationID) 元组序列,然后将 转换为查找。

    如果需要从 LocationID -> Item 对象本身进行查找,则对上述内容进行微不足道的修改。

    【讨论】:

    • 在您看来,在这种情况下,使用new 创建匿名类型对象与Tuple.Create 有什么区别/优点/缺点?
    • 我选择匿名类型是为了可读性(特别是因为这是如此,读者可能对这些概念有不同的技能水平)。它有点冗长,但比 Item1、Item2 等更容易理解。如果上下文清楚,Tuple.Create IMO 没有任何问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多