我有一個字典,在某些鍵之間進行映射
var map = new Dictionary<string, string> (){ {"A"/span>, "One"/span>}, {"B"/span>, "一"/span>}, {"C"/span>, "二"/span>}. };
我也有一個包含數值的字典
var values = new Dictionary< string, double>() { {"A"/span>, 2. 0}, {"B", 1.0}, {"C", 1.0}. };
我想把這些值映射到第三個字典中,這樣map的值就是這個新字典的鍵。也就是說,我想讓新的字典成為
var result = new Dictionary< string, double>() {{"One"/span>, 3. 0}, {"2", 1.0};
這當然可以通過使用回圈來實作,比如
var result = new Dictionary< string, double>()。
foreach (var kv in values)
{
var key = map[kv.Key];
var value = kv.Value;
if (result.TryGetValue(key, out var temp)
result[key] = value temp;
else[/span
result.Add(key, value)。
}
或者類似的東西...
但是,是否有可能使用linq在一個單行程式中做到這一點呢?
uj5u.com熱心網友回復:
試試這個,
var result = map
.Join(values, x => x.Key, y => y.Key, (x, y) => (x.Value, y.Value))
.GroupBy(x => x.Item1)
.ToDictionary(x => x.Key, y => y.Sum(s => s.Item2))。
DotNet Fiddle。https://dotnetfiddle.net/tWd9j5
uj5u.com熱心網友回復:
看起來你在尋找Join方法
var result = map.Join(values, x => x.Key, y => y.Key, (x, y) => (x.Value, y.Value)).ToDictionary(x => x.Item1, y => y.Item2) 。
而且要處理重復的值
var result = map
.Join(values, x => x.Key, y => y.Key, (x, y) => (x.Value, y.Value))
.GroupBy(x => x.Item1)
.ToDictionary(x => x.Key, y => y.First().Item2)。
uj5u.com熱心網友回復:
你當然可以。
var result = (from m in map
join v in values
on m.Key equals v.Key
group v.Value by m.Value into sameVal
select new { MValue = sameVal.Key, VValue = sameVal.Sum() }).ToDictionary(a => a.MValue, b => b.VValue)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321578.html
標籤:
