Преобразуйте словарь <MyType>.ValueCollection в IList <MyType>

Я использую 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;
}
16
задан C. Ross 29 March 2010 в 19:08
поделиться

4 ответа

Вам нужно будет сделать копию, но, вероятно, это хорошо. В C # 2 ваш текущий код почти самый чистый из возможных. Его можно было бы улучшить, напрямую построив свой список на основе ваших значений ( List list = new List (valueCollection); ), но копия все равно потребуется.

Однако, используя 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;
}

(Конечно, в этом случае этот метод становится действительно бесполезным - но Я хотел продемонстрировать это вам ...)

26
ответ дан 30 November 2019 в 17:38
поделиться

Это невозможно.

Словарь (включая его коллекцию Values ​​) - это по своей сути неупорядоченные коллекции; его порядок будет меняться в зависимости от хэш-кодов его ключей. Вот почему ValueCollection не реализует IList в первую очередь.

Если вы действительно захотите, вы можете создать класс-оболочку, который реализует IList и обертывает ValueCollection , используя foreach цикл в индексаторе. Однако это плохая идея.

2
ответ дан 30 November 2019 в 17:38
поделиться

Как насчет

Dictionary<int, MyType> dlist = new Dictionary<int, MyType>();
IList<MyType> list = new List<MyType>(dlist.Values);
3
ответ дан 30 November 2019 в 17:38
поделиться

Вы можно использовать конструктор:

public IList<MyType> MyValues
{
    get { return new List<MyType>(myDictionary.Values); }
}

(Отредактировано для удаления утверждения, в котором я не уверен на 100%.)

0
ответ дан 30 November 2019 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: