C#Linq合并词典

时间:2015-07-02 11:33:29

标签: c# linq dictionary

任何人都可以帮我解释以下几行

  

a.Concat(b).GroupBy(p => p.Key).ToDictionary(g => g.Key,g =>   。g.Last()值);

Dictionary<string, string> a = new Dictionary<string, string>();
Dictionary<string, string> b = new Dictionary<string, string>();

a.Add("1", "a");
a.Add("2", "a");
a.Add("4", "a");
a.Add("6", "a");
a.Add("7", "a");

b.Add("2", "sdfsdd");
b.Add("3", "dfvdfvd");
b.Add("4", "sdfdss");

由于我是“linq”的新手,我无法理解这段代码。我只是理解它连接两个字典的值,第二个字典的值首先取代了值,但是如何?

4 个答案:

答案 0 :(得分:1)

如你所说,这会连接两个词典。

a.Concat(b)

然后,从连接列表中,我们根据字典键

对值进行分组
.GroupBy(p => p.Key)

最后,我们将数据导出为字典,使用现有密钥作为导出字典中的键

.ToDictionary(g => g.Key, 

以及与该键匹配的最后一个值作为值。该组中的其他值将被忽略。

g => g.Last().Value);

方法中使用的表达式,例如p => p.Key,在这种情况下粗略表示&#34;在列表中的对象类型之前,使用变量名p使用它,然后从=>之后的表达式中获取值}&#34;

希望这可以帮助您了解它正在做什么。当我第一次开始使用它时,我花了一些时间来解决问题。

答案 1 :(得分:0)

a.Concat(b)返回IEnumerable的{​​{1}}个 然后按键分组KeyValuePair<string, string>,它返回GroupBy(p => p.Key),基本上可以枚举组。每个组都有一个键和键值对列表 而最重要的部分: IEnumerable<IGrouping<string, KeyValuePair<string, string>>> 它从可枚举中创建一个字典。
第一个lambda ToDictionary(g => g.Key, g => g.Last().Value);选择从g => g.Key获取的字典键。
第二个lambda IGrouping使用g => g.Last().Value方法获取组的最后一个元素,因此如果第一个和第二个字典之间发生碰撞,则第二个字符中的元素将被视为值。

答案 2 :(得分:0)

请记住,Dictionary<key, value>可以被视为对的集合:(无论数据如何在内部实际存储)。在C#-speak中,将Dictionary视为KeyValuePair<key, value>个实例的集合。对Concat的调用是将两个Dictionary实例的内容解压缩为两个IEnumerable<KeyValuePair<key, value>>实例,只需将两者合并为一个IEnumerable<KeyValuePair<key, value>>

但是,对于合并两个Dictionary实例,不会有重复键,Concat的输出可能包含重复的键值。因此,Concat结果中的项目应按键值分组。这是GroupBy的作用 - 它从每个key中选择KeyValuePair,如果是新的,则会创建一个新的组条目,并将组密钥设置为{{ 1}}键。组值是一个仅包含KeyValuePair值的集合。如果密钥不是新密钥,则KeyValuePair中的值将添加到现有组的集合中。

最后一部分 - KeyValuePair决定当ToDictionaryDictionary包含给定键值时,哪个Dictionary的值获胜。在这种情况下,它是来自b的值,因为a中的项目首先出现在Concat结果中,ToDictionary正在选择每个组中的最后一个元素。如果合并需要保留a的值,那么Last中对ToDictionary的调用将被First的调用所取代。并且严格来说,合并的Dictionary必须与输入Dictionary的类型相同。它可以是Dictionary<string, IEnumerable<string>>,通过调用

保留每个键的所有值

GroupBy(g => g.Key, g => g.Select(val => val.Value))

答案 3 :(得分:-1)

  

a.Concat(b).GroupBy(p =&gt; p.Key).ToDictionary(g =&gt; g.Key,g =&gt;   。g.Last()值);

它包含三个扩展方法,它连接ab并返回新字典:

  1. Enumerable.Concat<TSource>方法: 连接两个序列。 TSource是输入序列元素的类型。在您的词典中,它指的是KeyValuePaird<string,string>类型。
  2. Enumerable.GroupBy<TSource, TKey>方法: 根据指定的键选择器功能对序列的元素进行分组。 TSource是源元素的类型。再次在这里是KeyValuePaird<string,string>类型。 TKeykeySelector返回的密钥的类型。
  3. ToDictionary(g => g.Key, g => g.Last().Value): 根据指定的键选择器函数从Dictionary<TKey, TValue>创建IEnumerable<T>
  4. 实际上这个方法将任何IEnumerable转换为Dictionary类型,它给出了Key和Value应该唯一的两个参数Key和Value。