어제 이상한 행동이 C# 코드에서 감지되었습니다. 내 설치는 다음 (정확히하지만 compareable로)입니다 :C# 서클 길 찾기
는사용자는 내가 중간에 좌표 0,0 확인란을 할당 확인란의 그리드를 본다. 당신으로
public class Position : CheckBox
{
public Coord coord;
public List<Position> nearPositions = new List<Position>();
public Position(int x, int y)
{
this.coord.x = x;
this.coord.y = y;
}
protected override void OnClick(EventArgs e)
{
if (this.Checked)
return;
base.OnClick(e);
this.checkConnections();
}
private void checkConnections()
{
foreach (Position position in this.nearPositions)
{
Route route = new Route(this, position);
}
}
}
: 나는의 standart 윈폼 체크 박스에서 상속하는 클래스라는 위치를 사용하는 체크 박스를 들어
public struct Coord
{
public int x, y;
public static bool operator == (Coord coord1, Coord coord2)
{
return coord1.x == coord2.x && coord1.y == coord2.y;
}
public static bool operator != (Coord coord1, Coord coord2)
{
return coord1.x != coord2.x || coord1.y != coord2.y;
}
public override int GetHashCode()
{
return this.x.GetHashCode()^this.y.GetHashCode();
}
public override bool Equals(object obj)
{
if (!(obj is Coord))
return false;
Coord coord = (Coord)obj;
if (coord.x == this.x && coord.y == this.y)
return true;
return false;
}
}
:
나는 두 좌표 사이에 쉽게 비교를 위해 구조체를 썼다 사용자가 각 체크 박스를 한 번만 클릭 할 수 있음을 알 수 있습니다.목록 nearPositions에는이 근처의 클릭 한 확인란 만 포함됩니다.
checkConnections() 메소드에서 나는 모든 (또는 일부만) 클릭 된 체크 박스가 서클에 연결될 수 있는지 알아 내려고합니다. 따라서 각 클래스 경로에 대한 클래스 경로의 새 개체를 만듭니다.
public class Route
{
private Position startPosition;
private List<Position> nodes = new List<Position>();
public Route(Position startPosition, Position nextPosition)
{
this.startPosition = startPosition;
this.nodes.Add(nextPosition);
this.findConnection();
}
public Route(Route route, Position nextPosition)
{
this.startPosition = route.startPosition;
this.nodes = route.nodes;
this.Add(nextPosition);
this.findConnection();
}
private void findConnection()
{
if (this.nodes.Count > 2 && this.nodes[this.nodes.Count - 1].nearPositions.Contains(this.startPosition))
{
//HERE THE ROUTE IS A CIRCLE
return;
}
List<Position> nextPositions = this.nodes[this.nodes.Count - 1].nearPositions.FindAll(p => !p.Equals(this.startPosition) && !this.nodes.Contains(p));
foreach (Position position in nextPositions)
{
if (this.nodes[this.nodes.Count - 1].nearPositions.FindAll(p => !p.Equals(this.startPosition) && !this.nodes.Contains(p)).Contains(position)) //TODO strange problem here...bad workaround need to fix
{
Route route = new Route(this, position);
}
}
}
}
내가 모든 possibity 국도의 객체를 만드는 것을 기억하십시오. 따라서 원에 많은 체크 박스가 포함되어있는 경우 많은 수의 Route 객체가 동시에 존재합니다. 어쩌면 내 문제를 재현하는 것이 중요합니다.
경로의 시작 위치는 항상 동일합니다. 사용자가 클릭 한 위치.
목록 노드에서 나는 cricle을 만드는 단계를 저장합니다.
이제 getConnection() 메서드 내부에 List nextPosition에 this.nodes [this.nodes.Count - 1] .nearPositions 목록 내부에 exsists가없는 위치가 포함될 수 있습니다. 그래서 foreach 루프 안에 추가 조건을 추가했습니다.
내 생각은 어쩌면 .FindAll() 메서드의 버그 일 수도 있고, 동시에 mutiple eoutes의 끝내기 문제 일 수도 있습니다.
내 질문 :
1. 내 문제를 재현 할 수 있습니까?
2. 그것은 어디에서 왔습니까?
3. 어떻게 해결할 수 있습니까?
답장을 보내 주셔서 감사합니다.
http://www.dotnetperls.com/debugging –
findConnection 및 checkConnections 메소드에서 작성한 Route로는 아무 작업도 수행하지 않습니다. 목록이나 다른 데이터 구조에 추가해야합니까? 나는이 방법들의 부작용을 볼 수 없다. –
@ NikolaD-Nick 점 // 경로가 원일 경우 경로를 처리하는 다른 함수를 호출하지만 전혀 문제가되지 않는다고 생각합니다. –