Я использую a Dictionary<int, MyType>
в классе. Тот класс реализует интерфейс, который требует IList<MyType>
быть возвращенным. Существует ли простой путь к бросить один к другому (не копируя всю вещь)?
Мое текущее решение следует:
private IList<MyType> ConvertToList(Dictionary<int, MyType>.ValueCollection valueCollection)
{
List<MyType> list = new List<MyType>();
list.AddRange(valueCollection);
return list;
}
Вам нужно будет сделать копию, но, вероятно, это хорошо. В C # 2 ваш текущий код почти самый чистый из возможных. Его можно было бы улучшить, напрямую построив свой список на основе ваших значений ( List
), но копия все равно потребуется.
Однако, используя LINQ с C # 3, вы могли бы:
myDictionary.Values.ToList();
При этом я бы (вероятно) не стал избегать копирования. Возврат копии ваших значений, как правило, более безопасен, так как это не позволяет вызывающему объекту создавать проблемы, если они попытаются изменить вашу коллекцию. Возвращая копию, вызывающий может выполнить list.Add (...)
или list.Remove (...)
, не вызывая проблем с вашим классом.
Изменить: учитывая ваш комментарий ниже, если все, что вам нужно, это IEnumerable
с Count, вы можете просто вернуть ICollection
. Этот напрямую реализуется ValueCollection
, что означает, что вы можете просто вернуть значения вашего словаря напрямую, без копирования:
private ICollection<MyType> ConvertToList(Dictionary<int, MyType>.ValueCollection valueCollection)
{
return valueCollection;
}
(Конечно, в этом случае этот метод становится действительно бесполезным - но Я хотел продемонстрировать это вам ...)
Это невозможно.
Словарь (включая его коллекцию Values
) - это по своей сути неупорядоченные коллекции; его порядок будет меняться в зависимости от хэш-кодов его ключей. Вот почему ValueCollection
не реализует IList
в первую очередь.
Если вы действительно захотите, вы можете создать класс-оболочку, который реализует IList
и обертывает ValueCollection
, используя foreach
цикл в индексаторе. Однако это плохая идея.
Как насчет
Dictionary<int, MyType> dlist = new Dictionary<int, MyType>();
IList<MyType> list = new List<MyType>(dlist.Values);
Вы можно использовать конструктор:
public IList<MyType> MyValues
{
get { return new List<MyType>(myDictionary.Values); }
}
(Отредактировано для удаления утверждения, в котором я не уверен на 100%.)