Musisz zrobić kopię, ale to chyba dobrze. W C# 2 twój obecny kod jest prawie najczystszy, jaki możesz zrobić. Zostałaby poprawiona poprzez bezpośrednie skonstruowanie listy wartości (List<MyType> list = new List<MyType>(valueCollection);
), ale kopia nadal będzie wymagana.
Używanie LINQ w C# 3, jednak będzie można zrobić:
myDictionary.Values.ToList();
Mając na uwadze powyższe, nie będę (prawdopodobnie) starają się unikać kopię. Zwracanie kopii twoich wartości wydaje się być bezpieczniejsze, ponieważ zapobiega wywoływaniu problemów przez wywołującego, jeśli próbują zmodyfikować swoją kolekcję. Zwracając kopię, wywołujący może wykonać list.Add(...)
lub list.Remove(...)
bez powodowania problemów z klasą.
Edit: Biorąc pod uwagę swój komentarz poniżej, jeśli wszystko co chcesz jest IEnumerable<T>
z Count, można po prostu wrócić ICollection<T>
. Ten jest bezpośrednio realizowane przez ValueCollection
, co oznacza, że można po prostu wrócić wartości słownika bezpośrednio, bez kopiowania:
private ICollection<MyType> ConvertToList(Dictionary<int, MyType>.ValueCollection valueCollection)
{
return valueCollection;
}
(prawda, metoda ta staje się naprawdę bezużyteczny w tym przypadku - ale chciałem wykazać go do ty ...)
Każde rozwiązanie opublikowane do tej pory obejmuje kopiowanie całej kolekcji. ** Przeczytaj pytanie **. – SLaks
@SLaks: Powiedziałem to bezpośrednio w mojej odpowiedzi ... (która nadal wymaga kopiowania). –
Czy jest jakaś istotność dla parametru key "int", czy jest to typ arbitralny? –