C# 如何将通用列表投影到词典中?
是否有一种简单、LINQ唯一的方法可以将泛型集合投影到字典中,从而消除以下代码块中的foreach:C# 如何将通用列表投影到词典中?,c#,linq,generics,C#,Linq,Generics,是否有一种简单、LINQ唯一的方法可以将泛型集合投影到字典中,从而消除以下代码块中的foreach: Dictionary<int, Player> _rankedPlayers = new Dictionary<int,Player>(); List<Player> rankedPlayers = Player.GetPlayers(Globals.FOOString, seasonCode); int i = 1; fore
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);
}
Dictionary\u rankedPlayers=newdictionary();
List rankedPlayers=Player.GetPlayers(Globals.FOOString,季节代码);
int i=1;
foreach(rankedPlayers中的玩家targetPlayer)
{
_添加(i,targetPlayer);
}
您正在寻找方法
您可以使用Enumerable的重载方法。选择生成元素索引的,并使用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;
}
}
公共静态类MyExtensions
{
公共静态词典(
这是(不可数的来源)
{
var dictionary=newdictionary();
var i=0;
foreach(源中的var项)
{
添加(++i,项);
}
返回字典;
}
}
但是如果你只使用一次,我会像你那样做。我想你想在每次插入时增加
I
,对吗?我当然想,保罗,忘了增加。然后你在你的问题中更改代码。当你可以使用KeyVakuePair
或Tuple
时,你正在创建一个不必要的类型。
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;
}
}