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

Linq expression to join a list and a dictionary

我有零件号列表:

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() 来执行此操作,但我无法弄清楚什么语句将使我得到 IEnumerable<string> 加入 partsquantities。它认为那将是 .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() : "");