用于联接列表和字典的 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

我想做的是定义一个字符串,无论partsquantities中有什么值,我都可以将其附加到销售代表名称上以类似于上面的示例。

似乎我应该能够通过对可枚举的 LINQ 操作进行string.Join()来做到这一点,但我无法弄清楚什么语句会让我获得加入 partsquantitiesIEnumerable<string>结果。 它以为这会是一个.Join(),但签名似乎不对。 有人可以开导我吗?

用于联接列表和字典的 Linq 表达式

也许是这样的东西?

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() : "");