2013-06-20 52 views
0

我不是最好的程序員,所以需要一些幫助來訂購這個列表。我有一些刺傷,但仍有一些錯誤的案例。有人可以幫我訂購這個清單嗎?

本質名單如下:

#, 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 

你認爲你可以幫忙嗎?

謝謝!

+4

你是如何代表這個清單?一個對象,一個數據庫? – christopher

+0

你有什麼試過的?你能告訴我們一些代碼嗎?哪一部分對你很難? – Ari

+2

我沒有看到排序...「跟在前面的ID」...但你的列表是0,1,3,2。我是否錯過了什麼? – DonBoitnott

回答

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 
} 
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具有所需的順序中的數據。

在上面,是:

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

但很明顯,代替自己的類型。

相關問題