📚

【C#】Generic Typeの異なるListのCollectionを作る

2021/04/17に公開

List<float>とList<int>とList<string>と……を一つのCollectionにまとめたいときがある。しかし各ListのGeneric Typeが異なるためにそのまま某かのGeneric Collictionにすることはできない。List<List> はできないということだ。
そこでPublicな読み書きの関数はGenericで中身は非GenericのCollectionを作成することで解決できる。

using System.Collections.Generic;

public sealed class ListCollection : IEnumerable
{
            readonly Dictionary<Type, IEnumerable> m_Lists = new Dictionary<Type, IEnumerable>();

            public void Add<T>(List<T> list)
            {
                m_Lists.Add(typeof(T), list);
            }

            public bool TryGetValue<T>(out List<T> list)
            {
                if (m_Lists.TryGetValue(typeof(T), out var enumerable))
                {
                    list = enumerable as List<T>;
                    return true;
                }
                else
                {
                    list = null;
                    return false;
                }
            }

            IEnumerator IEnumerable.GetEnumerator() => m_Lists.GetEnumerator();
}

初期化子に対応しているので以下のように使うことができる。

var lists = new ListCollection() { new List<float>(), new List<int>(), new List<string>() };
List<float> floats;
lists.TryGetValue(out floats);

Discussion