2011-08-30 47 views
2

我将信息添加到使用此代码的字典:订购一个字典

foreach (string word in lineList) 
{ 
    if (dictionary.ContainsKey(word)) 
     dictionary[word]++; 
    else 
     dictionary[word] = 1; 
} 

// I believe this is what needs to change..? 
var ordered = from k in dictionary.Keys select k; 

当我使用StreamWriter打印出其打印出来在它加入到dictionary顺序的行。

我想要做的是打印出来的订单首先比较PartDescription然后PartNumber并打印出来的数字。

文件看起来是这样的:

PartDescription  PartNumber  Name  X  Y  Rotation 
1608RTANT    147430   J1  20.555 -12.121  180 
TANTD     148966   J2  20.555 -12.121  270 
SOMETHING    148966   R111  20.555 -12.121  360 
SOMETHING    148966   C121  20.555 -12.121  180 
SOMETHING    148966   R50  205.555 -12.121  180 
SOMETHING    148966   R51  -205.555 125.121  270 
SOMETHING    148966   R52  20.555 -12.121  0 
SOMETHING    148966   C12  20.555 -12.121  0 
1709RTANT    147430   C98  20.555 -12.121  0 
1608RTANT    147429   QD1  20.555 -12.121  180 
1709RTANT    147430   F12  20.555 -12.121  0 
1609RTANT    147445   P9  20.555 -12.121  180 

StreamWriter想这样的输出:

1, 1608RTANT, 147429, 1 //Line#, PartDescription, PartNumber, # of Duplicates (from dictionary key) 
2, 1608RTANT, 147430, 1 
3, 1609RTANT, 147445, 1 
4, 1709RTANT, 147430, 2 
5, SOMETHING, 148966, 6 
6, TANTD, 148966, 1 
+1

也可以使用SortedDictionary 。它比Dictionary 稍慢,因为SD是O(log 2 n),D是O(1),但它会始终保持数据的排序顺序。仅取决于哪一种方法对您的使用更重要:可能的最快查找或保持数据顺序。如果你只是将它排序一次输出,就按建议排序。我只是想抛出另一个选项,以防万一你需要在多个地方使用这些数据,那么排序的代价可能会增加,并使SD值稍微慢一些。 –

回答

7

那么你肯定能拿到钥匙在一个有序的方式容易:

var ordered = from k in dictionary.Keys orderby k select k; 

甚至更​​简单:

var ordered = dictionary.Keys.OrderBy(x => x); 

注意,你不应该在字典存储在其中添加它们的顺序对依靠 - 基本上你应该不承担任何排序从字典。

+0

哇。快。简单。 :) 谢谢! – theNoobGuy

+0

我已更新问题 – theNoobGuy

+0

@theNoobGuy:您的更新代码与原始代码没有明显关系 - 没有排序的迹象。请发布简短但完整的*程序来证明问题。 –