2017-01-27 1 views
0

기본적으로 내가하려는 것은 특정 3D 위치에 값을 저장하고 액세스 할 수있는 방법이 있습니다. 예를 들어, 3의 값을 위치 (4, 5, 6)에 저장하면 나중에 (4, 5, 6)에서 값을 호출하도록 프로그램에 알리고 3을 반환합니다.배열로 비슷한 값으로 정수 인덱스의 3D 목록 만들기

나는 생각 (하지만 매우 잘못 될 수 있음) 나는 이런 식으로 뭔가에 목록을 작성하여 시작 했죠 그 :

public static IList<IList<IList<int>>> valueList = new List<List<List<int>>>(); 

하지만 난이 목록에있는 항목을 저장하거나 접근 할 방법을 모른다.

배열과 비슷한 것을 원하지만 배열에 음수가 될 가능성이 있고 배열의 최소 또는 최대 위치가 없어야하므로 배열을 사용하고 싶지 않습니다.

내가하는 일에 대한 단서가 없기 때문에이 작업을 수행하는 방법을 알고 있거나이 목표를 달성하기위한 대체 방법을 알고 있는지 알려 주시기 바랍니다. 감사.

답변

2

3 차원 공간을 모델링하는 것처럼 들립니다. 3D 좌표를 나타내는 클래스를 만들 수 있습니다. 이 클래스의 인스턴스를 사전의 키로 사용하여 객체를 저장할 수 있습니다. 간단한 시작점은 다음과 같습니다.

using System; 
using System.Linq; 
using System.Collections.Generic; 

public class Vector 
{ 
    public int X {get; set;} 
    public int Y {get; set;} 
    public int Z {get; set;}  
} 

public class Program 
{ 
    public static void Main() 
    { 
     Dictionary<Vector, int> map = new Dictionary<Vector, int>(); 

     var vector = new Vector() { X = 4, Y = 5, Z = 6 }; 
     map.Add(vector, 3); 

     int result = 0; 
     if (map.Keys.Contains(vector)) 
     { 
      result = map[vector]; 
     } 

     Console.WriteLine(result); 
    } 
} 

사용하기 전에 사전에 키가 들어 있는지 확인해야합니다. int 대신 double을 사용하는 것이 좋습니다. 그리고 평등 연산자와 해시 함수를 오버라이드하여 동등한 벡터를 비교할 수도 있습니다.

+0

목록에 항목이 많으면 느리게 실행되지 않습니까? 나는 수십억 개의 아이템을 가질 것으로 기대하고있다. (1000x1000x1000 큐브는 10 억 아이템이다.) –

+0

@AaronFranke 메모리에 수십억 가지를 저장하는 것은 비 스타트 애스트 라기보다는 전체 접근 방식을 다시 생각해보십시오. – InBetween

+0

고마워요. 제가 필요로하는 바로이 것입니다. 그리고 어떤 비용으로도 수십억 가지를 피할 것이라고 결정했습니다. 16x16x16 덩어리의 사전으로 그리드를 나눠서 처리하는 데 필요한 시간을 분할했습니다. 나는 크기를 제한하기 위해서'int'보다는'short's로 좌표를 제한했습니다. Unity3의 Vector3과 비슷한 Point3 클래스를 호출하게되었습니다. 나는 Vector3의 모든 메서드를 추가하고 언젠가는이를 게시 할 수 있습니다. –

관련 문제