Архив Тэгов: Dictionary

.Net Программирование

Dictionary key by value или Как получить ключ(key) по значению(value) в объекте Dictionary C#

Опять-таки недавно обнаружил что в C# не реализован поиск по значению в Dictionary. В моем случае использовался словарь, в котором ключ и значение были типа строка(string). Для решения данной проблемы необходимо написать и использовать следующий метод:

var myDictionary = new Dictionary<string, string>();
 
public string GetKeyByValue(string value)
        {
            foreach (var recordOfDictionary in myDictionary)
            {
                if (recordOfDictionary.Value.Equals(value))
                    return recordOfDictionary.Key;
            }
            return null;
        }

Следует так же добавить, если пары с таким значением не найдется, то вернется null со всеми вытекающими последствиями.

.Net Программирование

Сериализация Dictionary C#

Недавно столкнулся с проблемой XML-сериализации словаря Dictionary. Оказывается, в .Net это просто-напросто не реализовано. Что же делать и как быть? Как не странно, пришлось писать свой класс, унаследованный от Dictionary и IXmlSerializable и самому реализовывать сериализацию объекта. К сожалению, другого выхода пока что не имеется(.
Когда XmlSerializer пытается обработать тип, который реализует IXmlSerializable, он просто передаст управление методу ReadXml(при десериализации) или WriteXml(во время сериализации). Другими словами, вы сами определяете как должны произойти сериализация и десериализация.

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
 
    [XmlRoot("Dictionary")]
public class XmlSerializableDictionary<TKey, TValue>
    : Dictionary<TKey, TValue>, IXmlSerializable
{
    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }
 
    public void ReadXml(System.Xml.XmlReader reader)
    {
        XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
        XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
        bool wasEmpty = reader.IsEmptyElement;
        reader.Read();
        if (wasEmpty)
            return;
        while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
        {
            reader.ReadStartElement("item");
            reader.ReadStartElement("key");
            TKey key = (TKey)keySerializer.Deserialize(reader);
            reader.ReadEndElement();
            reader.ReadStartElement("value");
            TValue value = (TValue)valueSerializer.Deserialize(reader);
            reader.ReadEndElement();
            this.Add(key, value);
            reader.ReadEndElement();
            reader.MoveToContent();
        }
        reader.ReadEndElement();
    }
 
    public void WriteXml(System.Xml.XmlWriter writer)
    {
        XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
        XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
        foreach (TKey key in this.Keys)
        {
            writer.WriteStartElement("item");
            writer.WriteStartElement("key");
            keySerializer.Serialize(writer, key);
            writer.WriteEndElement();
            writer.WriteStartElement("value");
            TValue value = this[key];
            valueSerializer.Serialize(writer, value);
            writer.WriteEndElement();
            writer.WriteEndElement();
        }
    }
}