如何通过其属性从列表中获取项目,然后使用它的其他属性?

时间:2014-08-15 14:40:52

标签: c# list xna

class Node
{
    int number;
    Vector2 position;
    public Node(int number, Vector2 position)
    {
        this.number = number;
        this.position = position;
    }
}

List<Node>nodes = new List<Node>();

for (int i = 0; i < nodes.Count; i++) //basically a foreach
{
    // Here i would like to find each node from the list, in the order of their numbers, 
    // and check their vectors
}

所以,正如代码几乎所说,我想知道我怎么能

  1. 从列表中查找特定节点,特别是属性为“number”的节点是i(例如,按照“number”属性的顺序浏览所有节点)。
  2. 检查其他属性
  3. 尝试过:

    nodes.Find(Node => Node.number == i);
    
    Node test = nodes[i];
    place = test.position
    
    由于其保护级别,他们显然无法访问node.number / node.position。

    另外,第二个问题是必须首先对节点进行排序。

    另见this question

    但是[]解决方案在“尝试过”的主题中,foreach解决方案似乎不适用于自定义类。

    我是编码新手(比如60小时),所以不要

    1. 以疯狂的方式解释。
    2. 说我不知道​​这个基本的东西是愚蠢的。
    3. 谢谢!

2 个答案:

答案 0 :(得分:2)

我会为NumberPosition添加properties,将其提供给外部用户(目前他们的access modifierprivate):

class Node
{
    public Node(int number, Vector2 position)
    {
        this.Number = number;
        this.Position = position;
    }

    public int Number { get; private set; }
    public Vector2 Position { get; private set; }
}

现在您的原始尝试应该有效:

nodes.Find(node => node.Number == i);

然而,这听起来像是对List<Node>进行排序,然后通过索引进行访问会更快。您将对列表进行一次排序并直接索引列表,并在每次迭代时查看所需项目的列表。

答案 1 :(得分:0)

List<Node> SortNodes(List<Node> nodes)
{
   List<Node> sortedNodes = new List<Node>();
   int length = nodes.Count; // The length gets less and less every time, but we still need all the numbers!
   int a = 0; // The current number we are looking for


   while (a < length)
   {
      for (int i = 0; i < nodes.Count; i++)
      {
         // if the node's number is the number we are looking for, 
         if (nodes[i].number == a)
         {
            sortedNodes.Add(list[i]); // add it to the list
            nodes.RemoveAt(i); // and remove it so we don't have to search it again.
            a++; // go to the next number
            break; // break the loop
         }
      }
   }

   return sortedNodes;
}

这是一个简单的排序功能。您需要先设置number属性public。 它将按您想要的顺序返回一个完整的节点列表。 另外:随着更多节点被添加到已排序的节点列表,搜索会更快。

确保所有节点都有不同的编号!否则会陷入无限循环!