选择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) =>
如何使用正确的语法,或者如何在一行内解决这个问题?
您可以使用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);