用于连接列表和字典的 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
我想做的是定义一个字符串,无论 parts
和 quantities
中的值是什么,我都可以将其附加到销售代表姓名上,类似于上面的示例.
似乎我应该能够在可枚举的 LINQ 操作中使用 string.Join()
来执行此操作,但我无法弄清楚什么语句将使我得到 IEnumerable<string>
加入 parts
和 quantities
。它认为那将是 .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() : "");
我有零件号列表:
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()
来执行此操作,但我无法弄清楚什么语句将使我得到 IEnumerable<string>
加入 parts
和 quantities
。它认为那将是 .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() : "");