2013-05-22 1 views
1

나는 오래된 프로그래머이기 때문에 배열을 잘못 남용하는 데 익숙하지만 동적으로 확장 할 수 있고 배열을 사용할 수 없기 때문에 사전을 사용해야 할 것입니다.C#에서 사전 사용하기

지금 ... 태양계의 값을 채우기 위해 그 태양계의 각 몸체에 약 20-30 개의 다른 값이 있어야합니다.

내 의도는 각 몸은 같은 고유 키와 값의이 사전 등 ...

Dictionary<int,string> BodyName = new Dictionary<int,string>() 
Dictionary<int,int> BodySize = new Dictionary<int,int>() 
Dictionary<int,int> BodyX = new Dictionary<int,int>() 
Dictionary<int,int> BodyY = new Dictionary<int,int>() 
Dictionary<int,int> BodyVelocity = new Dictionary<int,int>() 

...

내 질문에 가장 좋은 방법 무엇을 사용하는 것이 었습니다 이 모든 사전에서 값을 검색하려고합니까? 각각의 '몸'에 대한 열쇠는 내가 루프의 많은이 작업을 수행 할 수 있습니다 알고 있습니다. 각 사전에서 동일하지만, 그 CPU 사이클에 매우 낭비 것 그리고 나를 위해 나쁜 일이다.

또한 고려 사전 목록하지만 그게 내가 특히 좋아하지 않는 다른 문제가

+7

Erm, 5 개의 필드를 가진'Body' 클래스를 만들고 나서,'Dictionary '을 가지고 있지 않아야합니까? –

+0

왜 클래스를 사용하지 않을지 확실하지 않습니다. – origin1tech

+2

태양계 몸체에 대한 각 속성에 대한 사전을 만드는 대신, 태양계 몸체에 관한 모든 정보를 보유하고있는 행성을 만들고 행성 사전을 만듭니다.(또는 키로 검색 할 필요가 없다면) – Patashu

답변

10

을 복합 형을 만들고 그것을 사용하는 사전으로 튀어 나와

키가 고유 식별자입니다 경우에 적합 입니다 -.. 행성 ID? 행성 이름? - 데이터를 검색하는 데 사용해야합니다. 사전에 대한 반복은 비 결정적. 행성 단지 반복 (또는 위치 인덱스 액세스)하는 경우 한편

Dictionary<int,PlanetaryBody> Bodies = new Dictionary<int,PlanetaryBody>() 

하는 시퀀스 적합하다. 이 경우 List을 사용하면 잘 작동합니다.
List<PlanetaryBody> Bodies = new List<PlanetaryBody>(); 
// Unlike arrays, Lists grows automatically! :D 
Bodies.Add(new PlanetaryBody { .. }); 

는 (나는 매우 드물게 목록을 통해 배열을 선택하지 않습니다 - 그것은 때때로 더 나은,하지만 자주.)


복합 유형 (즉, class을)를로 그룹에 다른 속성을 사용 큰 개념 또는 분류 그룹 :

class PlanetaryBody { 
    public string Name { get; set; } 
    public double Mass { get; set; } 
    // etc. 
} 
+0

클래스에 관해서도 잘 살펴 봤는데 ... 클래스에 대해 잘못 이해할 수는 있지만 성능에 문제가 있습니다. 하지만 그 외에는 몸에 클래스를 사용하고 속성을 설정해야합니다. – user2411504

+0

@ user2411504 ** 이와 같은 클래스를 사용하면 성능 문제가 발생하지 않습니다 ** (많은 사전 개체보다 * 성능이 우수 할 것입니다). 의미있는 것을 수행하는 깨끗한 코드를 작성하십시오. 간단한 (그러나 충분히 유연함), 이해할 수 있고, 유지할 수 있습니다. 모든 프로젝트가 수백 개의 수업으로 얼마나 느릴 지 생각하십시오! 농담 일 뿐이야, 그들은 빠르다 : [97/3 규칙] (http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize)으로 가라. 이것은 3 %가 아니므로 성능에 대해 걱정하지 마십시오. – user2246674

+0

Nice ... 모든 데이터를 저장하기 위해 클래스 작업 준비를 시작하겠습니다. – user2411504

2

그냥 클래스를 사용하십시오.

public class Planet { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Size { get; set; } 
    // and so on for each property of whatever type you need. 
} 

당신은 새로운까지 새로운 행성이 필요한 경우 : 조작 목록으로 그래서 LINQ

사용하여 다음

var list = new List<Planet>(); 
list.Add(planet); 
// adding the planet you created above. 

찾습니다

var planet = new Planet(); 
planet.Name = "Saturn"; 
// again finish populating the properties. 

이 목록에 추가하려면를

+0

클래스에 대해 궁금한 점 중 하나는 메모리 사용량입니다. 사전만큼 효율적이거나 거의 같습니다. 시체는 결국 수천 또는 수만 가지로 추가 될 것입니다. – user2411504

+0

에 따라 다릅니다. 사전에 사용 된 기본 객체를 조사해야합니다. 일반적으로 성능이 저하되는 곳은 데이터를 조작하는 것입니다. 거기에는 모든 종류의 콜렉션 유형이 있습니다. 하나는 다른 것보다 낫을 수 있습니다. 당신이하는 일에 다시 의존하십시오. – origin1tech

+0

모두 내가 분명히 거기서부터 수업을 시작할 것이라고 말했는데, 당신은 당신의 기준에 기초한 속도와 단위 테스트의 모음으로 채워 넣을 수 있고, 가장 잘 맞는 것을 볼 수 있습니다. 결론 나는 이것에 대한 보편적 인 대답이 하나 있다고 생각하지 않는다. – origin1tech

관련 문제