views:

183

answers:

4

I need something similar to List<String, Int32, Int32>. List only supports one type at a time, and Dictionary only two at a time. Is there a clean way to do something like the above (a multidimensional generic list/collection)?

+6  A: 

In .NET 4 you can use List<Tuple<String, Int32, Int32>>.

Pavel Belousov
Unfortunately I'm on .NET 3.5, but I'll keep this in mind for 4.0!
Alex
+12  A: 

Best way is to create a container for it ie a class

public class Container
{
    public int int1 { get; set; }
    public int int2 { get; set; }
    public string string1 { get; set; }
}

then in the code where you need it

List<Container> myContainer = new List<Container>();
Jason Jong
+1 since it doesn't require a .Net4 tuple and can be trivially implemented with a class, but -1 because you should avoid public fields on a class. Implement as a property and use simple `{get; set;}` instead.
Robert Paulson
You will probably need to override Equals and GetHashCode too
Rohan West
type Container should be an immutable struct since it only represent values.
this. __curious_geek
Depending on the implementation needs for Alex, he can decide if he needs an Equals to, and also decide Class Vs Struct, again depending on the needs of his project, however if its just for storing values, then a struct would make sense.
Jason Jong
+1  A: 

Well, you can't do this til C# 3.0, use Tuples if you can use C# 4.0 as mentioned in other answers.

However In C# 3.0 - create an Immutable structure and wrap all types' insances within the structure and pass the structure type as generic type argument to your list.

public struct Container
{
    public string String1 { get; private set; }
    public int Int1 { get; private set; }
    public int Int2 { get; private set; }

    public Container(string string1, int int1, int int2)
        : this()
    {
        this.String1 = string1;
        this.Int1 = int1;
        this.Int2 = int2;
    }
}

//Client code
IList<Container> myList = new List<Container>();
myList.Add(new Container("hello world", 10, 12));

If you're curious why create immutable structs - checkout here.

this. __curious_geek
A: 

Based on your comment, it sounds like you need a struct with two integers stored in a dictionary with a string key.

struct MyStruct
{
   int MyFirstInt;
   int MySecondInt;
}

...

Dictionary<string, MyStruct> dictionary = ...
Austin Salonen
This assumes the strings are intended to be unique.
Anthony Pegram