Подтвердить что ты не робот

Конвертировать словарь <MyType>.ValueCollection в IList <MyType>

Я использую 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;
}
4b9b3361

Ответ 1

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

Используя LINQ с С# 3, вы сможете:

myDictionary.Values.ToList();

Сказав это, я бы (вероятно) не попытался избежать копирования. Возвращение копии ваших значений имеет тенденцию быть более безопасным, поскольку оно предотвращает возникновение проблем вызывающего абонента, если они пытаются изменить вашу коллекцию. Возвращая копию, вызывающий может выполнять list.Add(...) или list.Remove(...), не вызывая проблем с классом.


Изменить: учитывая ваш комментарий ниже, если все, что вам нужно, это IEnumerable<T> с графом, вы можете просто вернуть ICollection<T>. Этот -, непосредственно реализованный ValueCollection, что означает, что вы можете сразу вернуть значения словаря без копирования:

private ICollection<MyType> ConvertToList(Dictionary<int, MyType>.ValueCollection valueCollection)
{
    return valueCollection;
}

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

Ответ 2

Как насчет

Dictionary<int, MyType> dlist = new Dictionary<int, MyType>();
IList<MyType> list = new List<MyType>(dlist.Values);

Ответ 3

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

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

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

Ответ 4

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

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

(Отредактировано, чтобы удалить утверждение. Я не уверен на 100%.)