통계, IT, AI

C#에서 Zip 및 익명형식의 배열 사용하기 본문

IT/기타

C#에서 Zip 및 익명형식의 배열 사용하기

Harold_Finch 2016. 11. 14. 22:41

1. 들어가며

코딩을 하다가 특정 순간에만 사용되고 이후로는 쓸 일이 없는 변수를 만들어야 했다. 상황을 간단하게 말하자면, 아래와 같은 dictionary에서 B,D,E에 해당하는 Value를 바꾸어야 했는데 B,D,E라는 정보는 더이상 사용되지 않았다. 

Dictionary<string, int> weights = new Dictionary<string, int>();
weights.Add("A", 75);
weights.Add("B", 80);
weights.Add("C", 67);
weights.Add("D", 94);
weights.Add("E", 78);
weights.Add("F", 81);


2. 구현

2.1. 최초 구현


처음에는 Key와 Value를 따로 선언하였다. 물론 문제 없이 컴파일이 되고 잘 돌아가지만 id와 w라는 변수는 이후로도 쓰일 일이 없는 변수이다. 의미없이 메모리를 차지하며 가독성도 떨어져 마음에 들지 않았다. 


string[] id = {"B","D","E"};
int[] w = {77, 97, 69};

for( int i=0; i<id.Length; i++)
{
	weights[id[i]] = w[i];
}


2.2. Zip


Python에는 이런 경우에 사용하기에 알맞게 Zip이라는 함수가 있다. C#에도 있다는 것을 확인하고 Zip과 익명함수를 이용하여 코드를 수정하였다. 의미없는 변수를 선언하지 않아 더 좋아 보인다. 다만 한가지 걸리는 점은, 바꾸어야 할 값이 많아진다면 Key와 Value를 매칭하기 어렵다는 점이다. 


foreach( var weight_info in new [] {"B","D","E"}.Zip( 
                            new [] {77, 97, 69}, 
                            (k, new_weight) => new{ k=k, v=new_weight}))
{
	weights[weight_info.k] = weight_info.new_weight;
}


2.3. 익명형식의 배열


마지막으로 익명 형식의 배열을 이용하였다. 깔끔해 보이며 k에 해당하는 v를 찾기도 쉽다. 하지만 k와 v를 반복해서 써줘야 한다는 것이 걸린다.


foreach( var weight_info in new []{ new{ k="B", v=77},
                                    new{ k="D", v=97},
                                    new{ k="E", v=69}})
{
	weights[weight_info.k] = weight_info.v;
}


3. 마치며

무엇을 사용할까 고민하다가 결국 2.3. 익명형식의 배열을 사용하는 것으로 하였다. 어찌됬든 제일 보기에 깔끔했기 때문이다. 더 깔끔하게 할 수 있는 방법이 있는지 계속 고민해봐야겠다.


Python에서 Zip에 관한 아이디어를 얻었으니 Python에도 익명형식이 있는지 알아보았는데 없었다. 대신 dict을 사용하여 2.3.과 동일한 결과를 아래와 같이 구현할 수 있었다. 


for k, v in {"B":77, "D":97, "E":69}.items():
    weights[k] = v;


Python이 짱인듯하다.

'IT > 기타' 카테고리의 다른 글

[python] mutable vs immutable  (0) 2017.11.28
[TensorFlow] 모델 저장 및 복원  (0) 2017.09.06
[기타] 티스토리 기초 설정  (1) 2017.07.09
C#에서 이벤트 사용하기  (1) 2017.01.29
C#과 R을 연동하기  (2) 2016.09.27
Comments