任何人都可以帮我解释以下几行
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”的新手,我无法理解这段代码。我只是理解它连接两个字典的值,第二个字典的值首先取代了值,但是如何?
答案 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
决定当ToDictionary
个Dictionary
包含给定键值时,哪个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()值);
它包含三个扩展方法,它连接a
和b
并返回新字典:
Enumerable.Concat<TSource>
方法:
连接两个序列。 TSource
是输入序列元素的类型。在您的词典中,它指的是KeyValuePaird<string,string>
类型。Enumerable.GroupBy<TSource, TKey>
方法:
根据指定的键选择器功能对序列的元素进行分组。 TSource
是源元素的类型。再次在这里是KeyValuePaird<string,string>
类型。 TKey
是keySelector
返回的密钥的类型。ToDictionary(g => g.Key, g => g.Last().Value)
:
根据指定的键选择器函数从Dictionary<TKey, TValue>
创建IEnumerable<T>
。实际上这个方法将任何IEnumerable转换为Dictionary类型,它给出了Key和Value应该唯一的两个参数Key和Value。