Я часто сталкиваюсь с этой проблемой: у меня есть словарь, где ключ - это простой числовой идентификатор, а значение - это объект. Идентификатор также содержится в определенном свойстве этого объекта значения.Словарь <K,V>, который реализует IList <V>
Тогда, я хочу, чтобы иметь возможность десериализации некоторый (формат-негибкий) XML, который выглядит как:
<listitem>
<id>20359</id>
<someotherval>foo</someotherval>
</listitem>
<listitem>
...
Это требует, чтобы я десериализация с List<V>
, и это неудобно, придется вручную конвертировать, что a Dictionary<K,V>
.
Вторая проблема со связыванием. В списках привязки требуется, чтобы источник реализовал ICollection
(если я правильно помню), и снова больно вручную создать новый List<V>
и заполнить его с Dictionary<K,V>
.
Мой текущий, довольно некрасиво, но функциональное решение должно иметь следующие классы:
public abstract class Keyed<KeyType>
{
public KeyType key { get; set; }
}
public class KeyedDictionary<KeyType, ValueType> :
Dictionary<KeyType, ValueType>
where ValueType : Keyed<KeyType>
{
// ...
}
public class KeyedList<KeyType, ValueType> :
IList<ValueType>,
System.Collections.IList
where ValueType : Keyed<KeyType>
{
public readonly KeyedDictionary<KeyType, ValueType> dict =
new KeyedDictionary<KeyType, ValueType>();
// ...
}
Это работает, но это внутренне большой и уродливый. Есть ли лучшие способы?
EDIT: Вот решение, на котором я остановился.
public interface IKeyed<KeyType>
{
KeyType Key { get; }
}
public class KeyedList<KeyType, ValueType> :
KeyedCollection<KeyType, ValueType>
where ValueType : IKeyed<KeyType>
{
protected override KeyType GetKeyForItem(ValueType item) { return item.Key; }
}
Это на самом деле выглядит очень хорошо для меня. Он отвечает требованиям, и это простые дженерики и интерфейсы, без дурачества. –
, пожалуйста, держите «C#» вне названия, если ваш вопрос не о языке программирования C#. Этот вопрос касается .NET, а не C#. C# - это только тот язык, который вы пишете, чтобы вы могли использовать .NET. –