使用LINQ在C#中重新映射查找键

时间:2015-06-25 15:06:45

标签: c# linq data-structures

我的Lookup看起来像这样:

Lookup<string, DataModel> lookup;

除此之外,我还有包含键映射的字典:

Dictionary<string, KeyModel> keyMappings;

我想要做的是以下列方式将查找中的字符串键重新映射到KeyModel实体:

Lookup    <string, DataModel> lookup;
             ||
             ||
Dictionary<string, KeyModel> keyMappings;
            ___________|
           v
Lookup<KeyModel, DataModel> result; 

2 个答案:

答案 0 :(得分:1)

假设:

SELECT * 
  FROM my_table 
 WHERE date_created >= TRUNC(SYSDATE,'mm') 
   AND date_Created < TRUNC(SYSDATE,'mm')+13;

回复是:

Dictionary<string, KeyModel> keyMappings = ...;
ILookup<string, DataModel> lookup = ...;

首先,使用ILookup<KeyModel, DataModel> lookup2 = lookup .SelectMany(x => x, (grouping, element) => new { Key = keyMappings[grouping.Key], Element = element }) .ToLookup(x => x.Key, x => x.Element); 重新线性化ILookup<,>,然后重新创建SelectMany

显然,您需要ILookup<,>来定义KeyModelGetHashCode(),或者您需要Equals()作为IEqualityComparer<KeyModel> <的参数传递/ p>

答案 1 :(得分:0)

您可以使用简单的foreach - 循环。

首先,您需要将Lookup转换为Dictionary。请参阅here

foreach (KeyValuePair<string, DataModel> kvp in lookup) {
KeyModel outValue;
if (keyMappings.TryGetValue(kvp.Key, out outValue))
{
    result.Add(outValue, lookup[kvp.Key]);
}}

不是最快的解决方案,也许有人想出一个不错的LINQ。