有人可以帮我订购这份清单吗?

时间:2013-06-20 11:18:37

标签: c# sorting

我不是最好的程序员,所以需要一些帮助来订购此列表。我有一些刺,但仍然得到一些错误的案例。

基本上,列表如下:

#, ID, PreceedingID
A, 1 ,     0
B, 2 ,     3
C, 3 ,     1   
D, 4 ,     2

我想订购它,以便列表遵循前面的ID。第一项的前缀ID始终为0。

#, ID, PreceedingID
A, 1 ,     0
C, 3 ,     1
B, 2 ,     3   
D, 4 ,     2

你认为你能帮忙吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

怎么样:

var data = new[] {
    new Row{ Name = "A", ID = 1, PreceedingID = 0},
    new Row{ Name = "B", ID = 2, PreceedingID = 3},
    new Row{ Name = "C", ID = 3, PreceedingID = 1},
    new Row{ Name = "D", ID = 4, PreceedingID = 2},
};
var byLastId = data.ToDictionary(x => x.PreceedingID);

var newList = new List<Row>(data.Length);
int lastId = 0;
Row next;
while (byLastId.TryGetValue(lastId, out next))
{
    byLastId.Remove(lastId); // removal avoids infinite loops
    newList.Add(next);
    lastId = next.ID;
}

在此之后,newList将数据按所需顺序排列。

在上文中,Row是:

class Row
{
    public string Name { get; set; }
    public int ID { get; set; }
    public int PreceedingID { get; set; }
}

但显然可以替代你自己的类型。

答案 1 :(得分:2)

您可以使用例如字典对其进行排序:

Dictionary<..> d = new Dictionary<..>()
foreach(var el in list){
    d[el.PreceedingID] = el; //put data to dict by PreecedingID
}
List<..> result = new List<..>();
int prec = 0; //get first ID
for(int i = 0; i < list.Length; ++i){
    var actEl = d[prec]; //get next element
    prec = actEl.ID; //change prec id
    result.Add(actEl); //put element into result list
}