用于联接列表和字典的 Linq 表达式
本文关键字:Linq 表达式 字典 列表 用于 | 更新日期: 2023-09-27 18:37:07
我有一个零件号列表:
var parts = new List<string> {"part1", "part2", "part3"};
我还有这些零件号的数量字典:
var quantities = new Dictionary<string, int> {{"part1", 45}, {"part3", 25}};
给定 |
的分隔符,我需要将这些值排列在一个平面文件中,如下所示:
SalesRep|part1|part2|part3
Mr. Foo|45||25
我想做的是定义一个字符串,无论parts
和quantities
中有什么值,我都可以将其附加到销售代表名称上以类似于上面的示例。
似乎我应该能够通过对可枚举的 LINQ 操作进行string.Join()
来做到这一点,但我无法弄清楚什么语句会让我获得加入 parts
和 quantities
的IEnumerable<string>
结果。 它以为这会是一个.Join()
,但签名似乎不对。 有人可以开导我吗?
也许是这样的东西?
var partValues = parts.Select(x => quantities.ContainsKey(x) ? quantities[x] : 0);
基本上,对于零件列表中的每个项目,您要么从字典中选择值,要么如果它不存在,则为 0。
为了使它更有趣一点,你可以在IDictionary<T,U>
上定义一个通用的扩展方法,使它更具可读性:
public static class DictionaryExtensions
{
public static U GetValueOrDefault<T,U>(this IDictionary<T, U> dict, T key)
{
if(dict.ContainsKey(key))
{
return dict[key];
}
return default(U);
}
}
然后你可以简单地写:
var partValues = parts.Select(quantities.GetValueOrDefault);
var parts = new List<string> { "part1", "part2", "part3" };
var quantities = new Dictionary<string, int> { { "part1", 45 }, { "part3", 25 } };
var result = string.Join("|",
from p in parts select quantities.ContainsKey(p)
? quantities[p].ToString() : "");