Dictionary中元素的顺序

Cap*_*mic 99 .net c# ienumerable dictionary

我的问题是关于枚举字典元素

// Dictionary definition
private Dictionary<string, string> _Dictionary = new Dictionary<string, string>();

// add values using add

_Dictionary.Add("orange", "1");
_Dictionary.Add("apple", "4");
_Dictionary.Add("cucumber", "6");

// add values using []

_Dictionary["banana"] = 7;
_Dictionary["pineapple"] = 7;

// Now lets see how elements are returned by IEnumerator
foreach (KeyValuePair<string, string> kvp in _Dictionary)
{
  Trace.Write(String.Format("{0}={1}", kvp.Key, kvp.Value));
}
Run Code Online (Sandbox Code Playgroud)

枚举的元素将以什么顺序排列?我可以强制命令按字母顺序排列吗?

Dar*_*rov 118

字典中元素的顺序是非确定性的.订单的概念根本没有为哈希表定义.所以不要依赖枚举,因为元素被添加到字典中.这不能保证.

从文档引用:

出于枚举的目的,字典中的每个项目都被视为KeyValuePair<TKey, TValue>表示值及其键的结构.返回项的顺序未定义.

  • 但是[有 OrderedDictionary](/sf/ask/280544771/#4007799)。 (2认同)

Mit*_*eat 25

如果您想要订购的元素,请使用OrderedDictionary.普通hastable /字典仅在存储布局的某种意义上被排序.

  • 在大多数情况下,OrderedDictionary是错误的.它既不是按键或值排序,也是由内部索引排序.SortedDictionary是以用户可以操作的方式排序的(默认键) (8认同)
  • 问题是询问按字母顺序排序(假设提问者正在谈论密钥)。有序字典,如果我正确理解文档,将按元素插入的顺序吐出元素,即不是按字母顺序排列,而是使用内部索引。SortedDictionary 可能最适合用户的问题。 (3认同)

Adr*_*iro 24

你可以随时使用SortedDictionary它.请注意,默认情况下,字典按键排序,除非指定了比较器.

我对使用OrderedDictionary你想要的东西持怀疑态度,因为文档说:

与SortedDictionary类的元素不同,OrderedDictionary的元素不按键排序.

  • 值得注意的是,“SortedDictionary&lt;K,V&gt;”是作为二叉搜索树实现的,与基于哈希表的“Dictionary&lt;K,V&gt;”相比,它的操作具有不同的时间和空间复杂度。如果用户需要 `O(1)` 插入/删除哈希表结构,并且还想按键顺序迭代元素,那么他们应该 `dict.Keys.OrderBy( k =&gt; k ).Select( k =&gt; dict[ k] )` 代替(以 `O(n)` 空间和 `O( n log n )` 时间为代价)用于 `OrderBy()` (需要在内部列表中缓冲整个键集合) 。 (3认同)

Guf*_*ffa 12

这些项目将按照它们碰巧物理存储在字典中的顺序返回,这取决于哈希码和项目的添加顺序.因此,订单看起来是随机的,并且随着实现的改变,您永远不应该依赖于保持相同的顺序.

您可以在枚举时订购商品:

foreach (KeyValuePair<string, string> kvp in _Dictionary.OrderBy(k => k.Value)) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

在框架2.0中,您首先必须将项目放在列表中以对它们进行排序:

List<KeyValuePair<string, string>> items = new List<KeyValuePair<string, string>>(_Dictionary);
items.Sort(delegate(KeyValuePair<string, string> x, KeyValuePair<string, string> y) { return x.Value.CompareTo(y.Value); });
foreach (KeyValuePair<string,string> kvp in items) {
  ...
}
Run Code Online (Sandbox Code Playgroud)


Bar*_*ton 11

对于OrderedDictionary:

 var _OrderedDictionary = new System.Collections.Specialized.OrderedDictionary();

_OrderedDictionary.Add("testKey1", "testValue1");
_OrderedDictionary.Add("testKey2", "testValue2");
_OrderedDictionary.Add("testKey3", "testValue3");

var k = _OrderedDictionary.Keys.GetEnumerator();
var v = _OrderedDictionary.Values.GetEnumerator();

while (k.MoveNext() && v.MoveNext()) {
    var key = k.Current; var value = v.Current;
}
Run Code Online (Sandbox Code Playgroud)

项目按添加顺序返回.


Tim*_*Čas 5

关联数组(又名哈希表)是无序的,这意味着可以以任何可以想象的方式对元素进行排序。

但是,您可以获取数组键(仅键),按字母顺序排序(通过排序功能),然后对其进行处理。

我无法给您C#示例,因为我不懂该语言,但这足以让您继续前进。