如何在C#中创建链接数组列表

时间:2013-03-11 19:46:07

标签: c# arrays collections linked-list

我需要创建一个具有链接列表容量的数组。

基本上,我需要一个基于静态索引的列表(比如数组),但是有可能获得下一个和前一个字段(并且可以轻松地在列表中前后循环,就像链表一样)。 注意:数组是二维的。我使用自定义类作为数组值。所以我可以为每个实例设置上一个和下一个属性。

是否有内置的C#集合?如果没有,有关如何创建这个非常简单版本的任何建议? (我已经有了这个版本,由2个方法组成。一个循环前进以设置前一个字段,另一个循环向后设置下一个字段,但它仍然是凌乱的)。

提前致谢

修改

问题是我使用2维数组。如果遍历我的数组:

            for (byte x = 0; x < Grid.GetLength(0); x++) 
            {
                for (byte y = 0; y < Grid.GetLength(1); y++) /
                {
                    //At certain point, I need to get the previous field. I can do:
                    if (y != 0)
                    {
                        y -= 2; //-2 because I will y++ in for. Already getting messy
                    }
                    else 
                    {
//What if y == 0? Then I can't do y--. I should get max y and  do x-- to get previous element:

                        y = (byte)(Grid.GetLength(1) - 1); //to get max value y

                        x--;
                    }
}
    }

2 个答案:

答案 0 :(得分:4)

有一个内置的LinkedList<T>类。

但是从你的描述中为什么阵列无法工作?它是静态的,基于索引的,您可以通过递增/递减索引轻松获取下一个和上一个元素。很难从代码中确切地看到您需要的东西,但我想指出您可以轻松地枚举多维数组:

var arry = new int[2,3];
foreach(var item in arry)
{
    ...
}

所以你可以将它与Stack<T>结构结合起来(推送堆栈中的项目并弹出它们以获得前面的结果)。

或者,您可以直接将数组转换为LinkedList

var list = new LinkedList(arry.Cast<int>()); // flattens array

或者保留原始数组中的索引并仍然循环使用值作为链接列表使用:

var list = new LinkedList(arry.Cast<int>.Select((item, i) => new 
{ 
    Item = item, 
    Index1 = i % arry.GetLength(1), 
    Index2 = i / arry.GetLength(0) 
}));
var node = list.First;
while(node.Next != null)
{
    Console.WriteLine("Value @ {1}, {2}: {0}", node.Value.Item, node.Value.Index1, node.Value.Index2);
    // on some condition move to previous node
    if (...)
    {
        node = node.Previous;
    }
    else
    {
        node = node.Next;
    }
}

答案 1 :(得分:2)

不,你没有。而不是放弃传统的数组来代替“智能链接节点数组”,而这正是你正朝着这个方向前进,试着在循环体中添加几个变量:

byte x_len = Grid.GetLength(0);
byte y_len = Grid.GetLength(1);
byte prev_x, next_x, prev_y, next_y;

for (byte x = 0; x < x_len; ++x) 
{
  prev_x = x == 0? x_len - 1 : x - 1;
  next_x = x == x_len - 1? 0 : x + 1;
  for (byte y = 0; y < y_len; ++y)
  {
    prev_y = y == 0? y_len - 1 : y - 1;
    next_y = y == y_len - 1? 0 : y + 1;

    // here, you have access to the next and previous
    // in both directions, satisfying your requirements
    // without confusing your loop variables.

  }
}