【问题标题】:Multidimensional data structure?多维数据结构?
【发布时间】:2012-10-23 16:34:25
【问题描述】:

我需要一个包含行和列的多维数据结构。

  • 必须能够在数据结构中的任何位置插入元素。示例:{A , B} 我想在AB 之间插入C{A, C, B}
  • 动态:我不知道数据结构的大小。
  • 另一个示例:我知道要插入元素的 [row][col]。前任。 insert("A", 1, 5),其中A 是要插入的元素15

编辑
我希望能够像这样插入。

    static void Main(string[] args)
    {
        Program p = new Program();
        List<List<string()>> list = new List<List<string>()>();
        list.Insert("RAWR", 1, 2); // RAWR is the element to insert, 1 is the row, 2 is the col.
        list.Insert("Hello", 3, 5);
        for (int i = 0; i < list.Count; i++)
        {
            Console.WriteLine(list[i]);
        }
        Console.ReadKey();
    }

当然这不起作用,因为列表不支持此功能。我知道这段代码不好,但我只想了解我想要完成的工作。

所以从某种意义上说,我会有一个用户来选择将元素插入到哪一行和哪一列。

【问题讨论】:

  • 问题是什么?你试过什么? How to Ask
  • 如果你在 [1,5] 插入,会发生什么。该行中的所有内容都向右移动吗?还是插入会导致项目 [1,end] 移动到 [2,0]?也就是说,它是否会移动整个网格中的项目?
  • 我尝试过使用 DataTable,但 DataTable 不允许我在 Table 的任何位置插入,我尝试过数组但我不知道数组的大小。我尝试过列表,但列表不允许我插入任何位置。
  • 可能是一个老式的链表? en.wikipedia.org/wiki/Linked_list
  • 链接列表不适用于我的功能,因为链接列表允许插入头部和尾部。

标签: c# data-structures multidimensional-array


【解决方案1】:

我认为列表列表应该可以正常工作:

IList<IList<T>> multiDim = new List<IList<T>>();

您可以像这样插入新行:

multiDim.Insert(atRow, new List<T>());

或在特定行中插入一个新元素:

multiDim[row].Insert(atColumn, myElement);

请注意,您的列表中需要有足够的元素才能调用Insert;否则,您将得到一个超出范围的异常。解决这个问题的最简单方法是编写一个小的实用程序方法,在可以插入之前添加空项:

private static Expand<T>(IList<T> list, int index) {
    while (list.Count < index) {
        list.Add(default(T));
    }
}

重写你的程序如下:

Expand(list, 1);
list.Insert(1, "HELLO");
Expand(list, 5);
list.Insert(5, "RAWR");

【讨论】:

  • NVM,我还是有这个问题。在我的问题帖子中添加编辑。谢谢你的意见!
  • hmmmm 我知道这是解决我问题的一种方法。
【解决方案2】:

也许 Dictionary 可能与元组一起使用,因为它是键:

Dictionary<Tuple<int, int>, string> dict = new Dictionary<Tuple<int, int>, string>();
dict.Add(new Tuple<int, int>(1, 5), "A");

【讨论】:

  • 您可能希望使用Tuple.Create 而不是构造函数。无论如何,这是一般惯例。
  • 嗯好吧。我仍在尝试了解元组是如何工作的。
  • @AustinTruong Tuple 只是一个简单的数据持有者类。在这种情况下,它将(接近)与创建具有两个整数属性的类相同,尽管值得注意的是它是不可变的,并且它还可以智能地重载 EqualsGetHashCode,因此它可以很好地作为关键Dictionary.
【解决方案3】:

SortedDictionary&lt;int, T&gt; 如果您的键是整数或任何有序的字符串,则似乎非常适合。只需将项目按键放入字典即可。

var sparseArray = new SortedDictionary<int, string>();
sparseArray.Add(1, "notepad.exe");
sparseArray.Add(5, "paint.exe");
sparseArray.Add(3, "paint.exe");
sparseArray.Add(2, "wordpad.exe");

【讨论】:

  • 关键似乎是一对整数,而不是单个整数,所以可能是Tuple&lt;int,int&gt;
  • 好的,那么我该如何做这个多维呢?
  • 我的编辑更清楚地表明我正在努力完成。感谢您的帮助。
  • @AustinTruong 正如我所说,正如另一个答案中所展示的那样,使用 Tuple&lt;int,int&gt; 作为键,而不是单个 int。此外,我认为没有理由使用 SortedDictionary 而不是常规的 Dictionary
  • 好的,谢谢!抱歉,我现在正试图了解这个元组是如何工作的。哈哈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
相关资源
最近更新 更多