假设我有一个Color
类
class Color
{
int id;
string name;
int? predecessorId;
Color(_id, _name, _predecessorId)
{
id = _id;
name = _name;
predecessorId = _predecessorId;
}
}
前任ID的目的是我可以拥有一组颜色并任意排序。 (我没有设计这种数据结构。)
假设我有以下七种颜色:
var colors = new []
{
new Color(0, "red", null),
new Color(1, "orange", 0),
new Color(2, "yellow", 1),
new Color(3, "green", 2),
new Color(4, "blue", 3),
new Color(5, "indigo", 4),
new Color(6, "violet", 5)
}
现在,假设我从外部源接收数据。数据如上所示,但颜色不一定按照predecessorId字段的顺序出现在数组中。但是,我将始终假设predecessorId值始终形成一个完整的链表。
给定一个由七个这些颜色对象组成的数组,我如何对它们进行排序,使第一个颜色对象没有前驱,第二个颜色对象作为其前身,依此类推。
我很清楚有很多方法可以使这只猫,但我使用C#.net,我想尽可能使用内置的框架类,以避免编写更多必须的代码保持。
答案 0 :(得分:2)
通过找到predecessorId == null
的颜色来挑选第一个(并且希望是唯一的)颜色。然后通过将predecessorId的字典索引到颜色直到找不到更多匹配项来找到下一个:
var current = colors.Single(c => c._predecessorId == null);
var sorted = new List<Color> { current };
var colorsByPredecessorId = colors.Where(c => c._predecessorId.HasValue)
.ToDictionary(c => c._predecessorId.Value, c => c);
while (colorsByPredecessorId.ContainsKey(current._id))
{
current = colorsByPredecessorId[current._id];
sorted.Add(current);
}
return sorted;
答案 1 :(得分:-2)