选择List< string>用索引插入字典

本文关键字:索引 插入 字典 List string 选择 | 更新日期: 2023-09-27 18:06:21

我有一个列表

List<string> sList = new List<string>() { "a","b","c"};

目前我选择它到一个字典中,结构如下:

//(1,a)(2,b)(3,c)
Dictionary<int, string> dResult = new Dictionary<int, string>();
for(int i=0;i< sList.Count;i++)
{
    dResult.Add(i, sList[i]);
}

但是对于Linq,我看到了一些更苗条的方式,比如ToDictionary((x,index) =>

如何使用正确的语法,或者如何在一行内解决这个问题?

选择List< string>用索引插入字典

您可以使用Select的过载来投影索引来填充匿名类型:

Dictionary<int, string> dResult = sList
    .Select((s, index) => new { s, index })
    .ToDictionary(x => x.index, x => x.s);

这与您的代码所做的相同。如果你想要的结果,你已经评论:(1,a)(2,b)(3,c)),你必须加上+1,所以ToDictionary(x => x.index+1, x => x.s)

没有ToDictionary方法可以在单个调用中给出这个,因为没有提供索引的重载,但是您可以使用Select重载,它接受Func<T, int, TResult>:

var dictionary = list.Select((value, index) => new { value, index })
                     .ToDictionary(pair => pair.index, pair => pair.value);

或者在c# 7中,使用ValueTuple:

避免创建一堆堆分配对象
var dictionary = list.Select((v, i) => (value: v, index: i))
                     .ToDictionary(pair => pair.index, pair => pair.value);

在c# 7.1版本中,您可以使用推断的ValueTuple文字表达式:

var dictionary = list.Select((value, index) => (value, index))
                     .ToDictionary(pair => pair.index, pair => pair.value);

(正如Tim所指出的,您需要将索引调整1以获得原始请求的输出。)

您也可以使用这种方法而不使用匿名类型:

Dictionary<int, string> dResult = Enumerable
    .Range(0, sList.Count())
    .ToDictionary(i => i + 1, i => sList[i]);

首先,您必须使用select-overload获取键和值,该方法还提供了当前使用元素的索引:

var tmp = sList.Select((x, i) => new { Key = i, Value = x });

创建字典:

var result = tmp.ToDictionary(x => x.Key, x => x.Value);

或者作为一行字:

var result = sList.Select((x, i) => new { Key = i, Value = x }).ToDictionary(x => x.Key, x => x.Value);

编辑:您还可以创建自己的扩展方法来使用您提供的语法:

public static Dictionary<TResultKey, TResultValue> ToDictionary<TSource, TResultKey, TResultValue>(this IEnumerable<TSource> src, Func<TSource, int, TResultKey> KeySelector, Func<TSource, int, TResultValue> ValueSelector) 
{
    var result = new Dictionary<TResultKey, TResultValue>();
    int i = 0;
    foreach (var element in src)
    {
        result[KeySelector(element, i)]  = ValueSelector(element, i);
        i++;
    }
    return result;
}

现在你可以这样调用它:

List<string> sList = new List<string>() { "a","b","c"};
var result = sList.ToDictionary((x, i) => i + 1, (x, i) => x);