Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the collection equivalent of a multi-dimensional array?

Tags:

c#

collections

I've got a group of data that looks like this:

001 001 One
001 002 Two
001 003 Three

002 001 One
002 002 Two
002 003 Three

...

Now, certainly, I could create an array of string[x][y] = z, but this array has to be resizable, and i'd prefer to use the string representations of the indexers than convert to numeric. The reason is that i will need to look up the data by string, and i don't see the point in needless string->number conversions.

My first thought was this:

Dictionary<string, Dictionary<string, string>> data;

data = new Dictionary<string, Dictionary<string, string>>();

Dictionary<string, string> subdata = Dictionary<string, string>();

subdata.Add(key, string);
data.add(key2, subdata);

and this works, but is somewhat cumbersome. It also feels wrong and kludgy and not particularly efficient.

So what's the best way to store this sort of data in a collection?

I also thought of creating my own collection class, but I'd rather not if I don't have to. I'd rather just use the existing tools.

like image 544
Erik Funkenbusch Avatar asked Jul 23 '09 02:07

Erik Funkenbusch


People also ask

What is a multidimensional array called?

The simplest multi-dimensional array is the 2D array, or two-dimensional array. It's technically an array of arrays, as you will see in the code. A 2D array is also called a matrix, or a table of rows and columns. Declaring a multi-dimensional array is similar to the one-dimensional arrays.

Is multidimensional and two-dimensional array same?

Its dimension can be increased from 2 to 3 and 4 so on. They all are referred to as a multi-dimension array. The most common multidimensional array is a 2D array.

What is the most common type of multidimensional array?

The most common type of multidimensional array is a two-dimensional array.

Is a multidimensional array an array of arrays?

A multidimensional array is an array containing one or more arrays.


2 Answers

This is pretty common request, and most people end up writing some variation of a Tuple class. If you're using ASP.Net, you can utilize the Triple class that's already available, otherwise, write something like:

public class Tuple<T, T2, T3>
{
    public Tuple(T first, T2 second, T3 third)

    {
        First = first;
        Second = second;
        Third = third;
    }

    public T First { get; set; }
    public T2 Second { get; set; }
    public T3 Third { get; set; }

}

There's a generic three-tuple class, so you can create a new List<Tuple<string, string, string>>() and create your tuples and add them. Expand on that basic class with some indexing functionality and you're up up and away.

Edit: A list with a dictionary doesn't seem like the correct approach, because each dictionary is only holding one value. There is no multi-entry relationship between the key and values - there is simply one multi-part key and one associated value. The data is equivalent to a database row (or tuple!).

Edit2: Here's an indexable list class you could use for convenience.

    public class MyTupleList : List<Tuple<string, string, string>>
    {
        public Tuple<string, string, string> this[string first, string second]
        {
            get
            {
                return (this.Find(x => x.First == first && x.Second == second));
            }
            set
            {
                this[first, second] = value;
            }
        }
    }
like image 144
womp Avatar answered Sep 28 '22 01:09

womp


I think this really depends on what you are modelling here. If you're planning to use an object-oriented approach, you shouldn't be thinking of these as arbitrary items inside a data structure.

I'm guessing from looking at this that the first two columns are serving as a "key" for the other items. Define a simple struct, and create a dictionary of like so:

struct Key {
   public int Val1 { get; set; }
   public int Val2 { get; set; }
}

....

Dictionary<Key, string> values;

Obviously Key and the items inside it should be mapped to something closer to what you are representing.

like image 38
Ryan Brunner Avatar answered Sep 28 '22 00:09

Ryan Brunner