如何将泛型列表投射到字典中?

本文关键字:字典 泛型 列表 | 更新日期: 2023-09-27 17:49:16

是否有一种简单的、仅使用linq的方法将泛型集合投射到Dictionary中,从而消除以下代码块中的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);
    }

如何将泛型列表投射到字典中?

您正在寻找ToDictionary方法

var _rankedPlayers = Player.GetPlayers(Globals.FOOString, seasonCode)
      .Select((item, index) => new { item, index })
      .ToDictionary(x => index, x => x.item);

您可以使用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;
    }
}

但是如果你只使用一次,我也会像你那样做。