2015-03-13 1 views
0

Я пишу сценарий поиска путей в Unity, и я пытаюсь вычислить IEnumerables, и я чувствую, что не правильно формулирую свои поисковые запросы в Интернете, потому что это совсем не то, что я хочу.Для каждого оператора с списком конструкторов?

У меня есть 3 скрипта, 1 поиск узлов и добавление в список OpenNodes, который является собственным скриптом с конструктором. У меня есть IEnumerable, и он все еще говорит, что он не может получить доступ, или он должен быть статическим, если он просто публичный. Так что мои коды следующим образом:

public class OpenNodes: IEnumerator, IEnumerable { 
public static Vector3 node; 
public static int g; 

public static IEnumerator GetEnumerator() 
{ 
    return (IEnumerator)this; 
} 

public OpenNodes(Vector3 newNode, int newGscore) 
{ 
    node = newNode; 
    g = newGscore; 

} 

так, что я пытаюсь сделать в другой «FinderScript» вдоль этих линий:

foreach(Vector3 node in OpenNodes) 

Я пытался изо всех сил, чтобы понять это, но Я никогда не работал в таких списках конструкторов. Это ново для меня, поэтому любая помощь была бы очень оценена .. Спасибо

EDIT: Для каждого из них нужно взять узел в качестве вектора3, поскольку он использует значения .x, .y и .z для сравнения и изменений ..

+1

@JeroenVannevel Просто потому, что что-то основное или вы считаете тривиальным, не означает, что это не очень хороший вопрос для переполнения стека. Этот вопрос не слишком широк **, потому что на него можно ответить с кратким объяснением того, как эти интерфейсы должны быть реализованы. – mason

+1

Прошу прощения, но как это не по теме? И эта ссылка не объясняет ничего, что меня путают с ... Basic это может быть, но вне темы это не так. – MrRoss

+0

Вы должны использовать общую версию IEnumerable, а реализация показана в [Как реализовать IEnumerable ] (http://stackoverflow.com/questions/11296810/how-do-implement-ienumerablet) – mason

ответ

0

Как вам нужно сохранить оценку за узел, вы можете просто использовать Dictionary<Vector3, int> для хранения значений.

например.

var nodes = new Dictionary<Vector3, int>(); 
nodes.add(node, gScore); 

И затем либо доступ к ним непосредственно

nodes[node] = ... 

или петли через них

foreach (var node in nodes.Keys) { 
    ... 
} 

В качестве альтернативы, возможно, вы можете создать объект, который отображает счет и узел вместе (или просто используйте Pair, а затем просто используйте список?

var nodes = new List<Vector3>(); 
var map = new Pair(node, gScore); 
nodes.add(map); 

Затем цикл через них как обычно:

foreach (var node in nodes) { 
    ... 
} 

Не уверен, что, если я правильно вас понял, и я не запускать этот код. НТН.

+0

Я понял это отлично !! Большое спасибо, но что, если по дороге я собираюсь пройти более двух значений? Если я правильно помню, словари хранят 2 значения? – MrRoss

+0

Хотя вы можете использовать 'Tuple' для нескольких значений, лучшим вариантом будет создание пользовательского объекта для хранения свойств :) – codemonkeh

+0

Итак, добавьте объект в список, но затем он начнет играть, что мне нужно будет извлекать эти значения из пользовательского объекта через цикл foreach. Я, хотя было бы проще получить доступ к узлу непосредственно в foreach, как в моем вопросе, чем создать пользовательский объект или такой ... Я действительно начинаю сомневаться, что это так, как кажется, все больше и больше проблема. Я могу запустить со словарем на данный момент и посмотреть, не решает ли он мою проблему. – MrRoss

0

Проблема, с которой я столкнулась, была на самом деле более простой, чем я понял. Ниже приведен код моего списка конструктора:

public class OpenNodes { 
public Vector3 node; 
public int g; 



public OpenNodes(Vector3 newNode, int newGscore) 
{ 
    node = newNode; 
    g = newGscore; 

} 


} 

Код для Еогеаспа выглядит следующим образом:

foreach(OpenNodes list in OpenNode) 

, чтобы заполнить список выглядит следующим образом:

OpenNode.Add(new OpenNodes(nodeLocation, 0)); 

удалить элемент выглядит следующим образом:

OpenNode.RemoveAll(OpenNodes => nodeLocation == OpenNodes.node && 0 == OpenNodes.g); 

и для доступа к моему узлу это просто:

list.node.x 
list.node 
list.node.z 

ect.

Это итерирование через каждый элемент списка как список, а затем вы вызываете каждую переменную после этого. Надеюсь, этот код поможет кому-то в будущем!

Смежные вопросы