将两个列表组合成在两个列表之间映射的查找 KVP 的简单方法

Easy way to combine two lists into a lookup KVP that maps between the two lists

我有两个列表,假设

    OtherColors = Color[]
    {
        Color.FromRgb(1,0,0),
        Color.FromRgb(0,0,1),
        Color.FromRgb(1,0,15),
    };

    Colors = Color[]
    {
        Color.FromRgb(1,4,4),
        Color.FromRgb(5,6,66),
        Color.FromRgb(4,5,7),
        Color.FromRgb(7,5,8),
        Color.FromRgb(2,9,2),
        Color.FromRgb(4,2,190),
        Color.FromRgb(5,5,2),
        Color.FromRgb(180,5,7),
        Color.FromRgb(5,9,171),
    };

将它们组合成用作查找的字典的最快/最简单方法是什么table,以便短列表中的每个项目作为值重复三次,而较长列表中的每个项目重复只是作为键插入到与较长列表中相同的位置?

最终看起来像

的东西
ColorLookup = new Dictionary<Color, Color>
{
    {Color.FromRgb(1,4,4), Color.FromRgb(1,0,0)},
    {Color.FromRgb(5,6,66), Color.FromRgb(1,0,0)},
    {Color.FromRgb(4,5,7), Color.FromRgb(1,0,0)},
    {Color.FromRgb(7,5,8), Color.FromRgb(0,0,1)},
    {Color.FromRgb(2,9,2), Color.FromRgb(0,0,1)},
    {Color.FromRgb(4,2,190),Color.FromRgb(0,0,1)},
    {Color.FromRgb(5,5,2), Color.FromRgb(1,0,15)},
    {Color.FromRgb(180,5,7),Color.FromRgb(1,0,15)},
    {Color.FromRgb(5,9,171),Color.FromRgb(1,0,15)},
};

我知道这很简单,但我对此一头雾水...

你不会比一个简单的循环更快。 最简单的是有争议的,但我更喜欢 linq-solutions。

var ColorLookup = Colors.Select((c,i) => new { Key = c, Value = OtherColors[i / OtherColors.Length]}).ToDictionary(v => v.Key, v=> v.Value);

Test here

虽然没有您希望的那么酷,但它确实有效,前提是这些列表保持原样:

var output = new Dictionary<Color, Color>();
for (int i = 0; i < colors.Length; i++)
{
    output.Add(colors[i], otherColors[(int)Math.Floor(i / 3M)]);
}

您可以将其参数化以处理不同大小的列表并进行一些边界检查。