开发者

Combining Dictionary<A,B> + Dictionary<B,C> to create Dictionary<A,C>

Any cool quick ways to take two dictionaries to create a third that maps the key of the first to the value of the second in an inner-join style?

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,d开发者_如何转开发ic2);
// dic3 = {{a1,c1},{a2,c2}}


You could do something like this to join on the inner value

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);

If you dump out result you'll see it is a Dictionary with the value {1: true, 2: false}


try this -

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 );


Maybe something with ToDictionary

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


        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);


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
}

I believe this will work for what you want


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;
}

Handles the case of dic2 not containing keys corresponding to dic1s value without fake null values being stored, and IMO is pretty clear. I do like some LINQ, but I thought I'd give a procedural answer for once...


The simplest solution:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜