结合词典<a,b> +词典<b,c>创建词典<a,c> </a,c> </b,c> </a,b>

时间:2011-03-23 14:04:18

标签: c# dictionary

任何很酷的快速方法可以让两个字典创建第三个,将第一个键映射到内连接样式中的第二个值?

Dictionary<A,B> dic1 = new Dictionary<A,B> {{a1,b1},{a2,b2},{a3,b3}};
Dictionary<B,C> dic2 = new Dictionary<B,C> {{b1,c1},{b2,c2},{b4,c4}};

Dictionary<A,C> dic3 = SomeFunction(dic1,dic2);
// dic3 = {{a1,c1},{a2,c2}}

7 个答案:

答案 0 :(得分:5)

你可以做这样的事情来加入内在价值

Dictionary<int, string> first = new Dictionary<int, string> { {1, "hello"}, {2, "world"}};

Dictionary<string, bool> second = 
    new Dictionary<string, bool> { { "hello", true }, {"world", false}};

var result = (from f in first
              join s in second on f.Value equals s.Key
              select new { f.Key, s.Value }).ToDictionary(x => x.Key, y => y.Value);

如果您转储结果,您会看到它是一个值为{1: true, 2: false}

的词典

答案 1 :(得分:3)

试试这个 -

Dictionary<string, string> a, b, c;

//code to initialize the 3 dictionaries. a,b are original dictionaries and c is the new dictionary

c = ( from ak in a.Keys
    where b.ContainsKey( ak )
    select new KeyValuePair<string, string>( ak, b[ ak ] ) ).ToDictionary( d => d.Key, d=> d.Value );

答案 2 :(得分:1)

public Dictionary<A,C> SomeFunction(dic1, dic2)
{
    var dic3 = new Dictionary<A,C>();
    foreach (var item in dic1)
    { 
         var item2 = dic2.Where(m=>m.Key == item.Value).FirstOrDefault(); 
         if (item2 != null) 
         {
             dic3.Add(item.Key, item2.Value);
         } 
    }
    return dic3
}

我相信这会适用于你想要的东西

答案 3 :(得分:1)

也许是ToDictionary的东西

dic1.Where(d1=>dic2.ContainsKey(d1.Value)).ToDictionary(d1=>d1.Key,d1=>dic2[d1.Value]);

答案 4 :(得分:1)

        Dictionary<int, string> dic1 = new Dictionary<int,string>();
        Dictionary<string, decimal> dic2 = new Dictionary<string,decimal>();

        dic1.Add(1, "one");
        dic1.Add(2, "two");
        dic1.Add(3, "three");
        dic1.Add(4, "four");
        dic1.Add(5, "five");

        dic2.Add("one",1.0m);
        dic2.Add("two", 2.0m);
        dic2.Add("three", 3.0m);
        dic2.Add("four", 4.0m);
        dic2.Add("five", 5.0m);


        Dictionary<int, decimal> result = (from d1 in dic1
                                           from d2 in dic2
                                           where d1.Value == d2.Key
                                           select new { d1.Key, d2.Value }).ToDictionary(p=>p.Key, p=>p.Value);

答案 5 :(得分:0)

public IDictionary<A, C> SomeFunction<A, B, C>(IDictionary<A, B> dic1, IDictionary<B, C> dic2)
{
    var dic3 = new Dictionary<A, C>();
    foreach (var item in dic1)
    {
        var a = item.Key;
        var b = item.Value;
        if (dic2.ContainsKey(b))
        {
            var c = dic2[b];
            dic3.Add(a, c);
        }
    }

    return dic3;
}

处理dic2不包含与dic1值相对应的键而不存储假null值的情况,IMO非常清楚。我确实喜欢LINQ,但我想我会给出一次程序性答案......

答案 6 :(得分:0)

最简单的解决方案:

var dict3 = dict1.ToDictionary(p => p.Key, p => dict2[p.Value]);