Простой способ объединить два списка в поисковый KVP, который отображается между двумя списками
У меня есть два списка, скажем
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)},
};
Я знаю, что это просто, но я отказываюсь от этого...
2 ответа
Решение
Вы не получите намного быстрее, чем простой цикл. Проще всего спорить, но я предпочитаю linq-решения.
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)]);
}
Вы можете параметризовать его для обработки списков разных размеров и проверки границ.