var r = new Dictionary<string, Point>();
r.Add("c3", new Point(0, 0));
r.Add("c1", new Point(0, 0));
r.Add("t3", new Point(0, 0));
r.Add("c4", new Point(0, 0));
r.Add("c2", new Point(0, 0));
r.Add("t1", new Point(0, 0));
r.Add("t2", new Point(0, 0));
var l = r.OrderBy(key => key.Key);
var dic = l.ToDictionary((keyItem) => keyItem.Key, (valueItem) => valueItem.Value);
foreach (var item in dic)
{
Console.WriteLine(item.Key);
}
Console.ReadLine();
8条答案
按热度按时间r6vfmomb1#
Input.OrderBy
不会排序字典,它会建立以特定顺序传回项目的查询。也许OrderedDictionary给了你你想要的。
或者使用通用SortedDictionary
yebdmbv42#
将未排序的对象加载到
SortedDictionary
对象中,如下所示:其中
unsortedCustomerData
是相同的泛型类型(Dictionary string, string
或在您的情况下为string, point
)。根据msdn:
SortedDictionary<TKey, TValue>(IDictionary<TKey, TValue>)
:初始化SortedDictionary<TKey, TValue>
类别的新执行严修,此类别包含从指定的IDictionary<TKey, TValue>
复制的元素,并使用索引键型别的预设IComparer<T>
实作。w8f9ii693#
由于Input.OrderBy创建了一个以有序顺序返回项的查询,因此只需将其分配给同一个字典即可。
objectDict = objectDict.OrderBy(obj => obj.Key).ToDictionary(obj => obj.Key, obj => obj.Value);
zc0qhyus4#
这只是猜测,但看起来像是您假设它要对输入进行排序。OrderBy方法实际上返回包含相同值的IOrderedEnumerable的有序示例。如果您希望保留返回值,可以执行以下操作:
大多数修改集合的方法都遵循同样的模式。这样做是为了不改变原始集合示例。这可以防止你无意中改变示例。如果你只想使用排序后的示例,那么你只需如上所示将变量设置为方法的返回值。
uqdfh47h5#
下面的代码使用另外两个list来sort字典。
上面代码的输出如下所示。
bxjv4tth6#
我以前
我把它转换成了字典
nfeuvbwi7#
这取决于你的需要。如果你需要一个列表的键一次排序将工作。我做了下面的测试,你可以运行,看看如何实现键排序。
如果你需要你的键总是被排序的话,我会使用一个
SortedDictionary
。在下面我将使用它的构造函数创建一个SortedDictionary
,用旧的字典作为参数。你可以运行测试并验证结果。SortedDictionary
的插入和检索时间为 O(log n),而Dictionary
的插入和检索时间为 O(1)。因此,如果只有一次或很少需要对元素进行排序,并且经常插入和删除,则需要一次排序。2w2cym1i8#
好的,检查一下这个,应该能用