Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List of Lists of different types

Tags:

c#

list

generics

One of the data structures in my current project requires that I store lists of various types (String, int, float, etc.). I need to be able to dynamically store any number of lists without knowing what types they'll be.

I tried storing each list as an object, but I ran into problems trying to cast back into the appropriate type (it kept recognizing everything as a List<String>).

For example:

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;
}

Am I doing something incorrectly? Is there a better way to store a list of lists of various types, or is there a better way to determine if something is a list of a certain type?

like image 803
themarshal Avatar asked Mar 19 '10 20:03

themarshal


1 Answers

The type List<T> inherits from the non-generic interface IList. Since all of the values in the myList type are bound intsance of List<T> you can use them as the non-generic IList. So you can use that to greatly simplify your logic

public int GetNumElements(int index) {
  object o = myLists[index];
  var l = o as IList;
  return l.Count;
}

Or alternatively since you know that all of the values stored in myList will be a bound version of List<T>, use IList as the type instead of object.

List<IList> myLists = new List<IList>();
...
public int GetNumElements(int index) {
  return myList[index].Count;
}
like image 119
JaredPar Avatar answered Oct 23 '22 18:10

JaredPar