给定两个大小相同的IEnumerable
,如何使用Linq将其转换为Dictionary
?
IEnumerable<string> keys = new List<string>() { "A", "B", "C" };
IEnumerable<string> values = new List<string>() { "Val A", "Val B", "Val C" };
var dictionary = /* Linq ? */;
字符串
而期望的输出是:
A: Val A
B: Val B
C: Val C
型
我想知道是否有一些简单的方法来实现它。
我应该担心性能吗?如果我有大量的收藏呢?
我不知道有没有更简单的方法,目前我是这样做的:
我有一个Extension方法,它将循环IEnumerable
,为我提供元素和索引号。
public static class Ext
{
public static void Each<T>(this IEnumerable els, Action<T, int> a)
{
int i = 0;
foreach (T e in els)
{
a(e, i++);
}
}
}
型
我有一个方法,它将循环其中一个Enumerable,并使用索引检索另一个Enumerable上的等效元素。
public static Dictionary<TKey, TValue> Merge<TKey, TValue>(IEnumerable<TKey> keys, IEnumerable<TValue> values)
{
var dic = new Dictionary<TKey, TValue>();
keys.Each<TKey>((x, i) =>
{
dic.Add(x, values.ElementAt(i));
});
return dic;
}
型
然后我使用它像:
IEnumerable<string> keys = new List<string>() { "A", "B", "C" };
IEnumerable<string> values = new List<string>() { "Val A", "Val B", "Val C" };
var dic = Util.Merge(keys, values);
型
输出是正确的:
A: Val A
B: Val B
C: Val C
型
5条答案
按热度按时间8e2ybdfx1#
使用.NET 4.0(或Rx的System.Interactive 3.5版本),您可以使用
Zip()
:字符串
uyhoqukh2#
或者根据您的想法,LINQ包含一个
Select()
重载,它提供索引。结合values
支持按索引访问的事实,可以执行以下操作:字符串
(If
values
保持为List<string>
,即...)nhhxz33t3#
我喜欢这种方法:
字符串
shyt4zoc4#
如果你使用MoreLINQ,你也可以在以前创建的
KeyValuePair
上使用它的ToDictionary扩展方法:字符串
还应该注意的是,使用
Zip
扩展方法对于不同长度的输入集合是安全的。imzjd6km5#
从.NET Core 3.0开始,您可以使用改进的Zip():
字符串
为这种情况定义一个扩展方法,你就能得到最好的结果了:)