linq 在C#中将两个列表Map到一个字典

ozxc1zmp  于 2023-07-31  发布在  C#
关注(0)|答案(5)|浏览(121)

给定两个大小相同的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

8e2ybdfx

8e2ybdfx1#

使用.NET 4.0(或Rx的System.Interactive 3.5版本),您可以使用Zip()

var dic = keys.Zip(values, (k, v) => new { k, v })
              .ToDictionary(x => x.k, x => x.v);

字符串

uyhoqukh

uyhoqukh2#

或者根据您的想法,LINQ包含一个Select()重载,它提供索引。结合values支持按索引访问的事实,可以执行以下操作:

var dic = keys.Select((k, i) => new { k, v = values[i] })
              .ToDictionary(x => x.k, x => x.v);

字符串
(If values保持为List<string>,即...)

nhhxz33t

nhhxz33t3#

我喜欢这种方法:

var dict =
   Enumerable.Range(0, keys.Length).ToDictionary(i => keys[i], i => values[i]);

字符串

shyt4zoc

shyt4zoc4#

如果你使用MoreLINQ,你也可以在以前创建的KeyValuePair上使用它的ToDictionary扩展方法:

var dict = Enumerable
    .Zip(keys, values, (key, value) => KeyValuePair.Create(key, value))
    .ToDictionary();

字符串
还应该注意的是,使用Zip扩展方法对于不同长度的输入集合是安全的。

imzjd6km

imzjd6km5#

从.NET Core 3.0开始,您可以使用改进的Zip():

var dictionary = keys.Zip(values).ToDictionary(x => x.First, x => x.Second);

字符串
为这种情况定义一个扩展方法,你就能得到最好的结果了:)

相关问题