1
是否可以按照它们在源文档中出现的相同顺序访问映射的键?即如果我有这个简单的文档:我可以依次读取YamlDotNet映射吗?
values:
first: something1
second: something2
third: something3
然后我就能够拿到钥匙的序列中的原始顺序:第一,第二,第三]
是否可以按照它们在源文档中出现的相同顺序访问映射的键?即如果我有这个简单的文档:我可以依次读取YamlDotNet映射吗?
values:
first: something1
second: something2
third: something3
然后我就能够拿到钥匙的序列中的原始顺序:第一,第二,第三]
实现此目的的一种方法是使用RepresentationModel
API。它允许获得YAML文档的底层结构紧密匹配的表示:
var stream = new YamlStream();
stream.Load(new StringReader(yaml));
var document = stream.Documents.First();
var rootMapping = (YamlMappingNode)document.RootNode;
var valuesMapping = (YamlMappingNode)rootMapping.Children[new YamlScalarNode("values")];
foreach(var tuple in valuesMapping.Children)
{
Console.WriteLine("{0} => {1}", tuple.Key, tuple.Value);
}
这种方法的缺点是,你需要“手动”解析文档。另一种方法是使用序列化,并使用保留排序的类型。我不知道任何现成的使用实施IDictionary<TKey, TValue>
具有此特征的,但如果你不关心性能高,它是相当简单的实现:
// NB: This is a minimal implementation that is intended for demonstration purposes.
// Most of the methods are not implemented, and the ones that are are not efficient.
public class OrderPreservingDictionary<TKey, TValue>
: List<KeyValuePair<TKey, TValue>>, IDictionary<TKey, TValue>
{
public void Add(TKey key, TValue value)
{
Add(new KeyValuePair<TKey, TValue>(key, value));
}
public bool ContainsKey(TKey key)
{
throw new NotImplementedException();
}
public ICollection<TKey> Keys
{
get { throw new NotImplementedException(); }
}
public bool Remove(TKey key)
{
throw new NotImplementedException();
}
public bool TryGetValue(TKey key, out TValue value)
{
throw new NotImplementedException();
}
public ICollection<TValue> Values
{
get { throw new NotImplementedException(); }
}
public TValue this[TKey key]
{
get
{
return this.First(e => e.Key.Equals(key)).Value;
}
set
{
Add(key, value);
}
}
}
一旦你有了这样的容器,你可以采取Serialization
API的优势来解析文档:
var deserializer = new Deserializer();
var result = deserializer.Deserialize<Dictionary<string, OrderPreservingDictionary<string, string>>>(new StringReader(yaml));
foreach(var tuple in result["values"])
{
Console.WriteLine("{0} => {1}", tuple.Key, tuple.Value);
}
只是为人们寻找这与无意推行有序字典:我觉得这个[TKEY的键]被错误地执行,你守首先检查密钥是否存在,除非你想重复。 另请参阅[this](https://msdn.microsoft.com/pl-pl/library/system.collections.specialized.ordereddictionary(v = vs.110).aspx) – MaLiN2223