繁体   English   中英

将两个列表组合成在两个列表之间映射的查找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),
    };

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

最终看起来像

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);

在这里测试

只要这些列表保持原样,它就不会像您希望的那样酷,但是它可以工作:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM