Одна из структур данных в моем текущем проекте требует, чтобы я сохранил списки различных типов (Строка, интервал, плавание, и т.д.). Я должен смочь динамично сохранить любое количество списков, не зная то, что вводит, они будут.
Я пытался хранить каждый список как object
, но я столкнулся с проблемами, пытающимися вспоминать в соответствующий тип (это продолжало распознавать все как a List<String>
).
Например:
List<object> myLists = new List<object>();
public static void Main(string args[])
{
// Create some lists...
// Populate the lists...
// Add the lists to myLists...
for (int i = 0; i < myLists.Count; i++)
{
Console.WriteLine("{0} elements in list {1}", GetNumElements(i), i);
}
}
public int GetNumElements(int index)
{
object o = myLists[index];
if (o is List<int>)
return (o as List<int>).Count;
if (o is List<String>) // <-- Always true!?
return (o as List<String>).Count; // <-- Returning 0 for non-String Lists
return -1;
}
Я делаю что-то неправильно? Существует ли лучший способ сохранить список списков различных типов или там лучший способ определить, является ли что-то списком определенного типа?
Тип List
наследуется от неуниверсального интерфейса IList
. Поскольку все значения в типе myList
имеют привязку к List
, вы можете использовать их как неуниверсальный IList
. Таким образом, вы можете использовать это, чтобы значительно упростить вашу логику
public int GetNumElements(int index) {
object o = myLists[index];
var l = o as IList;
return l.Count;
}
Или, поскольку вы знаете, что все значения, хранящиеся в myList
, будут связанной версией List
, используйте IList
в качестве типа вместо объекта
.
List<IList> myLists = new List<IList>();
...
public int GetNumElements(int index) {
return myList[index].Count;
}