Вы можете использовать Linq для упорядочения одного словаря по индексу его значения в другом словаре.Вероятно, есть более короткий способ сделать это, но это должно работать:
var dict1 = new Dictionary<int, string>
{
{12, "hello"},
{67, "green"},
{29, "blue"},
{15, "red"},
{40, "house"}
};
var dict2 = new Dictionary<string, string>
{
{"tree", "green"},
{"person", "hello"},
{"car", "red"},
{"floor", "red"},
{"dirt", "green"},
};
var ordered = dict2
.OrderBy(d2Item => dict1.FirstOrDefault(d1Item => d1Item.Value == d2Item.Value).Key)
.ToDictionary(item => item.Key, item => item.Value);