是否有一种简单的,仅使用LINQ的方法将一个通用集合投影到一个字典中,这将消除以下代码块中的foreach:
Dictionary<int, Player> _rankedPlayers = new Dictionary<int,Player>();
List<Player> rankedPlayers = Player.GetPlayers(Globals.FOOString, seasonCode);
int i = 1;
foreach (Player targetPlayer in rankedPlayers)
{
_rankedPlayers.Add(i, targetPlayer);
}
答案 0 :(得分:7)
您正在寻找ToDictionary
方法
var _rankedPlayers = Player.GetPlayers(Globals.FOOString, seasonCode)
.Select((item, index) => new { item, index })
.ToDictionary(x => index, x => x.item);
答案 1 :(得分:1)
您可以使用Enumerable.Select
的重载方法生成元素的索引,并使用Enumerable.ToDictionary
将其投影到字典中:
var rankedPlayers = Player.GetPlayers(Globals.FOOString, seasonCode)
.Select((item, index) => Tuple.Create(item, index))
.ToDictionary(item => item.Item1 + 1, item => i.Item2);
如果您的播放器列表太长,您可能会觉得创建大量Tuple
个实例并使用外部索引感觉不舒服:
var i = 0;
var rankedPlayers = Player.GetPlayers(Globals.FOOString, seasonCode)
.ToDictionary(i => ++i, item => item.Item2);
虽然这种方法为i
上的闭包创建了一个新类。
如果这对您来说仍然太多,您可以创建自己的扩展程序:
public static class MyExtensions
{
public static Dictionary<int, TSource> ToDictionary<TSource>(
this IEnumerable<TSource> source)
{
var dictionary = new Dictionary<int, TSource>();
var i = 0;
foreach(var item in source)
{
dictionary.Add(++i, item);
}
return dictionary;
}
}
但是如果你只使用它一次,我会像你一样使用它。