2010-05-12 5 views
1

나는 상호 언어가 딸꾹질하고 있습니다. C#에서이 목록처럼 큰 컬렉션을 그리고 과 내가 가진 :C#에서 참조 컬렉션을 만들 수있는 방법

의 특성을 가진지도 클래스 :
List<byte[]> 이미지;
목록 <Tile> 타일;

의 타일 등급 :
byte[] ImageData;
int X;
int Y;

지금 내가지도 클래스에 이미지를 추가 할과 타일 클래스에 "참조"그것의 imageData의 속성을 가지고있다. 나는 이미지 [0]을 할당 할 수 없다는 것을 발견했다. 목록의 개체에 대한 참조를 가질 수 없습니다.

제 수정은 사전을 작성하는 것입니다. 이게 최선의 방법인가요? 아니면 어떻게 든 객체 컬렉션에 "포인터"를 가질 수 있습니까? 의견에 대 한 응답에서

  • 내가 imageData의이 목록의 첫 번째 바이트 배열을 가리키는 후 나는이 목록에 해당 이미지를 변경하고 타일의 이미지를 잡아 한 타일의 무리가 있고 그들은 이전의 경우 이미지 지정자. 따라서 타일을 할당하여 목록의 첫 번째 이미지를 만든 다음 이미지를 변경하십시오. 이제 타일 이미지가 새로운 이미지를 참조 할 것으로 기대됩니다. 그들은하지 않습니다.

최종 개정 - gladford3x의 코드를 살펴보십시오 (아직 서식을 마스터하지 못했습니다). Main의 마지막 줄은
입니다. myMap.Images [0] = image2; 전화 할 때
잘 myMap.Tiles [0]는 내가지도 클래스 내에서 명명 된 컬렉션을 사용

을 갈 수있는 올바른 방법이라고 생각 첫 번째 바이트의 배열

+0

나는 그것이 당신이 원하는 것을 따라 가지 않습니다. List에 Tile 객체를 추가하면 Tile이 참조 유형이기 때문에 참조 목록을 갖게됩니다. 당신이하고 싶은 것에 대한 코드 예제를 줄 수 있습니까? – galford13x

+0

당신이 여기서 무엇을하려고하는지 잘 모르겠습니다. 'Images [0]'은 완전히 작동해야합니다. 게다가, "객체 컬렉션에 대한 포인터"부분은 다소 혼란 스럽습니다 :'this.Images' *는 실질적으로 그러한 포인터입니다. – Jon

+2

Images [0]에 저장된 이미지를 바꾸고 그 이미지를 사용하는 타일이 변경 사항을 반영하는 것에 대해 이야기하고 있습니까? 이 경우 이미지 데이터가 아닌 색인을 전달하고 실제 이미지를 가져와야 할 때 Map을 사용할 수 있습니다. 나는. ImageData를 저장하는 대신 ImageIndex를 저장하십시오. –

답변

1

에서 데이터를해야합니다 .ImageData

Map yourMap = new Map(); 
yourMap.Tile[0].ImageData = yourByteArray; 

당신이 무슨 일을하고 있다는 것입니다 :

public class Map 
{ 
    public List<byte[]> Images; 
    public Dictionary<int, Tile> Tiles;//you could use an int or a string to name the item 
} 

그래서 당신은 이미지 데이터를 설정할 수 있습니다?

0

는 지금은지도 클래스에 이미지를 추가 할 및 "참조"는

List<Map> list = new List<Map>(); 
list.Add(new Map()); 
list[0].ImageData = new byte[]; 

// Access the list later on, the same Map object is referenced. 

그것은 참조 형은 업데이트 할 수 있도록 타일 클래스의 imageData의 속성을 가지고있다. 목록을 복사하면 원본 참조가 계속 업데이트됩니다. 클래스는 값 유형 (바이트 배열 ImageData)을 보유하지만 힙에 저장되므로 포인터 관리에 대해 걱정할 필요가 없습니다.

0

나는 완전히 이해하고 있는지 잘 모르겠다. 나는이 질문을 몇 번 읽었으며 여기서 내가 생각해내는 것이있다. 다음은 나를 위해 잘 작동하는 것 같습니다. 이 개념을 개념 증명으로 사용하고 ICollection, IEnumerator, IList 또는 사용자의 요구에 부합하는 인터페이스를 구현하는 것이 좋습니다.


편집 :

static void Main(string[] args) 
{ 
    Map myMap = new Map(); 
    myMap.Images = new List<byte[]>(); 
    myMap.Tiles = new List<Tile>(); 

    byte[] image = new byte[] { 1, 2, 3 }; 
    byte[] image2 = new byte[] { 10, 20, 30 }; 
    myMap.Add(image); 
    myMap.Add(image2); 

    byte[] image3 = new byte[] {100,200,255}; 
    myMap[0]=image3; 

    printallmaps(myMap); 
    myMap.Tiles.ForEach(c=>printall(c)); 
} 


public class Map 
{ 
    public List<byte[]> Images { get; set; } 
    public byte[] this[int i] 
    { 
     get 
     { 
      return Tiles[i].ImageData; 
     } 
     set 
     { 
      if(i >= this.Count) 
      { 
       this.Insert(i,value); 
      } 
      else 
      { 
       Tiles[i].ImageData = value; 
      } 
     } 
    } 
    public List<Tile> Tiles { get; set; } 
    public int Count {get {return Tiles.Count;}} 
    public void Add(byte[] image) 
    { 
     this[this.Count] = image; 
    } 
    public void Insert(int x, byte[] image) 
    { 
     Tile tile = new Tile(); 
     tile.ImageData = image; 
     Tiles.Insert(x,tile); 
    } 
} 

public class Tile 
{ 
    public byte[] ImageData; 
    int x; 
    int y; 
} 
+0

여러분이 놓치고있는 부분은 myMap.Images [0]에서 이미지를 변경하는 메인에 줄을 추가하는 것입니다. 첫번째 타일은 이미지를 변경하지 않습니다. –

+0

인덱서가 옵션인지 확실하지 않습니다. 그러나 Map에 자신의 인덱서를 구현할 수 있다면이를 사용하여 Tiles에 직접 액세스 할 수 있습니다. 나는 위의 편집에 넣었다. – galford13x

0

여기서 문제는 당신의지도 이미지를 관리하는이지만, 타일을 사용합니다. 올바르게 이해하면 타일에지도를 알리는 것이 싫으므로 직접 이미지를 참조하는 것이 좋습니다. 이 경우 이미지 데이터가 포함 된 TileImage 클래스를 만들면됩니다. Map에 TileImage 인스턴스 컬렉션을 유지하고 TileImage를 각 타일에 전달합니다. 이제 주어진 타일에 고정 된 참조가 있습니다. 해당 타일 유형의 이미지를 변경하려면 TileImage의 이미지 내용을 업데이트하십시오. 이렇게하면 간접적 인 수준이 만들어집니다. 실제 코드에서

public class TileImage 
{ 
    public byte[] ImageData; 
} 

public class Tile 
{ 
    public TileImage Image; 
    int x; 
    int y; 
} 


물론, 당신은 속성 캡슐화하고 가능한 이상적 일이 불변해야한다.

관련 문제