Мой вопрос будет довольно последовательным.
У меня есть общий класс Cell<T>
.И у меня есть клиентский класс, который работает с двумерным массивом Cell<T>
:
public sealed class Environment
{
private Cell<YUV>[,] primaryLayer;
public Colorizator(Cell<YUV>[,] layer)
{
// initialization...
}
// ...
}
В классе Environment
я вызываю метод, который делает следующее:
for(var ix = 1; ix < this.Width - 1; ix++)
{
for(var iy = 1; iy < this.Height - 1; iy++)
{
this.primaryLayer[ix, iy].Window[0] = this.primaryLayer[ix - 1, iy + 1];
this.primaryLayer[ix, iy].Window[1] = this.primaryLayer[ix, iy + 1];
this.primaryLayer[ix, iy].Window[2] = this.primaryLayer[ix + 1, iy + 1];
this.primaryLayer[ix, iy].Window[3] = this.primaryLayer[ix + 1, iy];
this.primaryLayer[ix, iy].Window[4] = this.primaryLayer[ix + 1, iy - 1];
this.primaryLayer[ix, iy].Window[5] = this.primaryLayer[ix, iy - 1];
this.primaryLayer[ix, iy].Window[6] = this.primaryLayer[ix - 1, iy - 1];
this.primaryLayer[ix, iy].Window[7] = this.primaryLayer[ix - 1, iy];
}
}
Он заполняет каждую ячейкуСоседство Мура с соседом.
Затем я использую алгоритм, аналогичный заливке, в другом методе:
foreach(var cell in some_list)
{
Parent = cell;
Parent.Conquer(Parent);
Parent.ViabilityRatio = this.ViabilityTresholds.Max;
lr[Parent.X, Parent.Y] = Parent;
while(true)
{
if(null == (Child = Parent.Window.FirstOrDefault(x => !(x as Cell<YUV>).IsMarked) as Cell<YUV>))
{
break;
}
else
{
Parent.Mark(Child);
var wt = default(Double);
foreach(Cell<YUV> ch in Child.Window)
{
// Operation fails
// NullReferenceException occurs: there's no cells in `Child` neighbourhood
wt += ch.ViabilityRatio;
}
Parent = Child;
}
}
}
Когда я пытаюсь перебрать Child.Window
, я обнаружил, что элементов соседства нет.Сначала я подумал, что Parent
и Child
, особенно Child
, не сохраняют ссылки на объекты, которые я им назначил.Я имею в виду, что cell
переменная in the foreach loop
имеет ненулевое соседство.Но Parent не имеет.
Решение 1. Помогло с родительской ячейкой
Я реализовал метод Copy
в Cell<T>
классе:
public Cell<T> Copy()
{
return (Cell<T>)this.MemberwiseClone();
}
С тех пор Parent
сохраняет свойство not-null Window
.
foreach(var cell in some_list)
{
Parent = cell.Copy();
Но if(null == (Child = Parent.Window.FirstOrDefault(x => !(x as Cell<YUV>).IsConquered) as Cell<YUV>).Copy())
пробная версия, к сожалению, не проходит.
Child
не имеет свойства not-null Window
.
Пожалуйста, помогите !!Спасибо!
Редактировать
Я пытался сделать следующее:
var ActiveWindow = (from ch in Parent.Window select (Cell<YUV>)ch).ToList();
ActiveWindow
коллекция поддерживает инициализацию всех соседей.Более того, все соседи, как я ожидал, инициализировали своих соседей.
Но когда я отлаживал это: Child = ActiveWindow[0]
... Child
не хранит соседей ..
Редактировать2
Child
ячейка не равна нулю.Я получаю исключение внутри else
предложения.
Это то, что я получил с моей Child
ячейкой:
И вот что я получил с Parent
ячейкой: