首页 > 解决方案 > 如何使用 Zip 将不同大小的列表合并到字典中?

问题描述

我在搞乱Zip,我对它的工作原理有点困惑。我无法以我想要的方式得到它。我必须列出如下所示的列表:

List<string> names = new List<string> 
{ 
    "Mark", "Chris", "Alex", "Default Name", "Jerilyn"
};

List<string> colors = new List<string> 
{
    "Green", "Blue", "Red", "Orange"
};

当我在这里使用 Zip 时:

var dict = names.Zip(colors, (k, v) => new { Key = k, Value = v })
                 .ToDictionary(x => x.Key, x => x.Value);

我得到了输出,Mark -> Green, Chris -> Blue, Alex -> Red, Default Name -> Orange但我想为所有“默认名称”实例添加一个默认值,所以它会像:

Mark -> Green, Chris -> Blue, Alex -> Red, Default Name -> 'Default Color', Jerilyn -> Orange

但是,我不明白为什么 Zip 只会添加键的前 4 个元素。我知道 Values 只有 4 个值,但我希望所有五个值都在集合中,最后一个条目是 null 或空字符串。这将使更改更容易。

标签: c#

解决方案


这是一个两步过程,因为你不知道"Default Name"会是什么颜色。

就是这样:

var names = new List<string>
{
    "Mark", "Chris", "Alex", "Default Name", "Jerilyn"
};

var colors = new List<string>
{
    "Green", "Blue", "Red", "Orange"
};

var map = names.Zip(colors, (n, c) => new { n, c }).ToDictionary(x => x.n, x => x.c);

map = names.ToDictionary(x => x, x => map.ContainsKey(x) ? map[x] : map["Default Name"]);

这给出了:

钥匙 | 价值  
------------ | --------
马克 | 绿色的  
克里斯 | 蓝色的   
亚历克斯 | 红色的    
默认名称 | 橙子
杰瑞琳 | 橙子

推荐阅读