'프로그래밍/C#'에 해당되는 글 18건

  1. 2019.02.15 enum extention 예시
  2. 2018.10.12 const , nonconst
  3. 2018.08.29 코드 교정?
  4. 2018.07.31 스트림이란??
  5. 2018.04.11 var
  6. 2018.03.28 캘린더
  7. 2018.03.25 C# Dictionary의 성능에 대해서.
  8. 2018.03.24 C# 자료구조 정리
  9. 2018.03.21 Stack 구현
  10. 2018.03.21 try catch 성능
프로그래밍/C#2019. 2. 15. 14:31

public static class ClubTypeToStringKey

{

    private static Dictionary<CLUB_TYPE, StringTableKeys> typeTostringKey

        = new Dictionary<CLUB_TYPE, StringTableKeys>();


    public static StringTableKeys ToStringKey(this CLUB_TYPE type)

    {

        if(typeTostringKey.ContainsKey(type))

        {

            return typeTostringKey[type];

        }


        StringTableKeys result;

        if (Enum.TryParse(type.ToString(), out result))

        {

            typeTostringKey.Add(type, result);

        }


        return typeTostringKey[type];

    }

}

'프로그래밍 > C#' 카테고리의 다른 글

const , nonconst  (0) 2018.10.12
코드 교정?  (0) 2018.08.29
스트림이란??  (0) 2018.07.31
var  (0) 2018.04.11
캘린더  (0) 2018.03.28
Posted by JinFluenza
프로그래밍/C#2018. 10. 12. 18:41

https://stackoverflow.com/questions/5833912/advantages-of-using-const-instead-of-variables-inside-methods

'프로그래밍 > C#' 카테고리의 다른 글

enum extention 예시  (0) 2019.02.15
코드 교정?  (0) 2018.08.29
스트림이란??  (0) 2018.07.31
var  (0) 2018.04.11
캘린더  (0) 2018.03.28
Posted by JinFluenza
프로그래밍/C#2018. 8. 29. 12:27

Use SonarLint
in Visual Studio


'프로그래밍 > C#' 카테고리의 다른 글

enum extention 예시  (0) 2019.02.15
const , nonconst  (0) 2018.10.12
스트림이란??  (0) 2018.07.31
var  (0) 2018.04.11
캘린더  (0) 2018.03.28
Posted by JinFluenza
프로그래밍/C#2018. 7. 31. 10:25

https://m.blog.naver.com/PostView.nhn?blogId=sfast&logNo=10107180108&proxyReferer=https%3A%2F%2Fwww.google.com%2F

'프로그래밍 > C#' 카테고리의 다른 글

const , nonconst  (0) 2018.10.12
코드 교정?  (0) 2018.08.29
var  (0) 2018.04.11
캘린더  (0) 2018.03.28
C# Dictionary의 성능에 대해서.  (0) 2018.03.25
Posted by JinFluenza
프로그래밍/C#2018. 4. 11. 11:09

var

c#에는 var이라는 키워드가 있다.

(개념 https://msdn.microsoft.com/ko-kr/library/bb384061(v=vs.120).aspx)

명식적으로 타입을 선언 하는 것이 아닌

암시적으로 타입을 선언하는 것이다.

 

int k =30; (명시적으로 int라고 선언)

var k =30; (암시적으로 선언)

밑에 var을 사용한 경우에는 컴파일러가 오른쪽에 있는 식에서 변수 형식을 유추한다.

이렇게 var을 사용 하더라도 성능에는 전혀 영향이 없다고 한다.

(C#컴파일러는 컴파일 타임에 var변수의 실제 유형을 추론하고, 생성된 IL에는 차이가 없다고 함)

 

그렇다면 var은 어떤 경우에 쓰면 좋을까? msdn에는 이렇게 적혀 있다.

 

1.var 은 쿼리 변수의 생성된 형식을 정확하게 확인하기 어려운 쿼리 식에서 유용할 수도 있습니다. 그룹화 및 정렬 작업에서 이러한 경우가 발생할 수 있습니다

(Ex) IEnumerable<string> , IQueryable<string> 둘을 처리할 때의 성능이 다르다)

2.var 키워드는 특정 변수 형식이 키보드에서 형식화하기 번거롭거나 명백하거나 코드 가독성에 도움이 되지 않는 경우에도 유용할 수 있습니다. var이 이런 방식으로 유용한 한 가지 예제로 그룹 작업에 사용되는 형식과 같은 중첩 제네릭 형식이 있습니다. 다음 쿼리에서 쿼리 변수의 형식은IEnumerable<IGrouping<string, Student>>입니다. 사용자 및 코드를 유지 관리해야 하는 다른 사용자를 이를 이해하기만 하면 간편하게 암시적 형식화를 사용하는 데 아무 문제도 없습니다.



귀찮게 타입명을 직접 선언하지 않아도 된다는 편의성도 분명 있지만


남발하면 다른 사람이 코드를 이해하기에 별로 좋지 않을 것이라는 생각이 든다.


예를 들어 var data = MyClass.GetData() 이런 식으로 작성을 해 놓으면 만든 사람은 data변수가 정확이 어떤 타입


인지 알 수 있겠으나, 다른 개발자는 data라는 변수가 정확히 어떤 타입인지 한눈에 알지는 못할 것이고 확인을 해


야 할 것이다.


그래서 msdn 문서 맨 밑에도 필요한 경우에만 var을 사용하라고 나와있다.


var을 사용 했을때 모호함을 일으키는 경우라면 명시적으로 선언하는 것이 훨씬 낫다.


특히 내장 숫자 타입을 사용하는 경우 형변환 문제가 생길 수 있기 때문에 피하는 것이 좋다.

 

 

-참고 msdn,effective c#

 

 


'프로그래밍 > C#' 카테고리의 다른 글

코드 교정?  (0) 2018.08.29
스트림이란??  (0) 2018.07.31
캘린더  (0) 2018.03.28
C# Dictionary의 성능에 대해서.  (0) 2018.03.25
C# 자료구조 정리  (0) 2018.03.24
Posted by JinFluenza
프로그래밍/C#2018. 3. 28. 22:21
public enum Day { Sun, Mon, Tue, Wed, Thu, Fri, Sat }
public class MyCalender
{
private readonly int[] endDay = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
private readonly int pivotYear = 1;
private readonly Day pivotFirstDay = Day.Mon;
public void PrintCalender(int year, int month)
{
//요일 출력--------------------
Console.WriteLine(string.Format(" {0}년 {1}월의 달력", year, month));
Console.WriteLine();
for (int i = 0; i < Enum.GetValues(typeof(Day)).Length; i++)
{
Console.Write(string.Format("{0} ", ((Day)i).ToString()));
}
Console.WriteLine();
//요일 출력--------------------
//출력하려는 달의 전달 1번째 요일을 알아냄(예를들어 3월을 입력했으면 3월1일이 무슨 요일인지)
Day day = GetFirstDayOfMonth(year, month);
int numberOfDays = endDay[month - 1];
//윤달 처리
if (month == 2 && IsLeapYear(year) == true) numberOfDays++;
//여기부터는 그냥 순서대로 출력해주는 부분
for (int i = 1; i <= numberOfDays; i++)
{
if (i == 1)
{
for (int j = 0; j < Enum.GetValues(typeof(Day)).Length; j++)
{
if (j < (int)day)
{
Console.Write(string.Format("{0,3} ", ""));
}
else
{
break;
}
}
}
Console.Write(string.Format("{0,3} ", i));
if ((i + (int)day) % 7 == 0) Console.WriteLine();
}
Console.WriteLine();
}
private bool IsLeapYear(int year)
{
//400으로 나누어 떨어지면 무조건 윤년 // 아닌경우
return ((year % 400 == 0) || ((year % 100 != 0) && (year % 4 == 0))) ? true : false;
}
//출력하려는 달의 1번째 요일 반환
private Day GetFirstDayOfMonth(int year, int month)
{
int currentYear = pivotYear;
int elapsedDays = (int)pivotFirstDay;
while (currentYear <= year)
{
for (int i = 0; i < endDay.Length; i++)
{
if (currentYear == year && month == i + 1)
break;
elapsedDays += endDay[i];
//윤년 체크
if (i == 1 && IsLeapYear(currentYear) == true)
elapsedDays++;
}
currentYear++;
}
//흐른 시간을 7로 나눴을때 나머지를 이용하면 출력하려는 달의 1일이 무슨 요일인지 나옴
return (Day)(elapsedDays % 7);
}
}
















.

출력을 원하는 달의 1일이 무슨 요일인지만 알면 그 달의 달력을 쉽게 보여줄 수 있다.

무슨 요일인지는 1 1 1일이 월요일이라는 사실을 이용하면 그리 어렵지는 않게 구할 수 있다.

위의 코드 상에서는 알고있는 특정 요일이 1년1월1일 하나 인데, 다른 것들을 또 알고 있다면 

(예를  들어 1900 1 1일이 월요일이라는 사실)

그걸 피봇 값으로 설정해서 1900년 이후의 날짜를 계산 할때 좀 더 빨라질 것이다.

코드를 짜다 보니 특정 범위 사이에 윤년이 몇개나 있는지 한번에 구할 수 있다면 코드도 엄청 단순해지고

성능도 말도 안되게(O(n) -> O(1)) 엄청 빨리질 것이라는 생각이 들었지만 일단 생각나는대로 바로 짜봤다.

다 만들고 나서 윤년의 갯수를 빠르게 구할 수 있는 방법이 있는지 찾아보니 있었다 ㅋ ㅋ ㅋ ㅋ ㅋ  

(https://stackoverflow.com/questions/4587513/how-to-calculate-number-of-leap-years-between-two-years-in-c-sharp)


그렇다. 나는 dog뻘짓을 하고 있었던 것이다.  -_- b


 


'프로그래밍 > C#' 카테고리의 다른 글

스트림이란??  (0) 2018.07.31
var  (0) 2018.04.11
C# Dictionary의 성능에 대해서.  (0) 2018.03.25
C# 자료구조 정리  (0) 2018.03.24
Stack 구현  (0) 2018.03.21
Posted by JinFluenza
프로그래밍/C#2018. 3. 25. 21:16

원문 https://stackoverflow.com/questions/3460729/is-there-a-limit-to-entries-in-a-dictionary



질문 : 3000개정도의 다른 데이터들이 있다. 그것을 구조체에 저장해서 관리하려고 한다.

 

그리고 나의 어플리케이션이 시작할 때 그 데이터들을 전부 Dictionary에 저장 해놓고 게임이 시작하기 전에 불러오려고 한다.

 

이것들의 성능이 궁금하다. 이정도의 데이터가 게임을 느리게 할 것인지

 

그리고 TryGetValue ContainsKey가 느린지?

 

 

 

답변 : 해쉬들이 잘 분포되어 있을때 그정도의 크기에서 TryGetValue와 ContainsKey는 꽤나 빠르다. 

 

Dictionary는 인덱스를 달 수 있는 버킷들(데이터를 담을 빈 공간)을 갖고있다

 

키를 이용해 값을 추가하거나 찾을 때 그것은 GetHashCode()를 이용해서 값을 반환한다

 

GetHashCode()에서는 버킷들의 수보다 적은 값이 나오도록 해쉬를 하고, 그것으로 관련된 버킷을 찾는다

 

버킷은 아마 비어 있거나 안에 여러 개의 아이템들이 있을것이다. Dictionary는 아이템들을 Equals()를 통해 비교한다.

 

찾고자 하는 버킷을 찾는 것은 O(1) 시간이 걸린다

 

그 다음에 같은 버킷 안에 들어있는 값들에 대해서 비교하는 것은 O(n)이 걸린다

 

여기서 O(n) Dictionary 모든 요소에 대한 것이 아니고 버킷 안에서 만이다.

 

일반적으로는 같은 버킷 안에 적은 수의 아이템들이 있을 것이다,

 

만약에 해쉬가 나쁘게 됐으면(중복이 많게) 같은 버킷 안에 많은 키값들이 있을 것이고 시간복잡도는 O(n)에 가까워질 것이다

 

최악의 경우는 List보다 나쁠 것이다, 왜냐하면 List역시 O(n)이지만 딕셔너리는 좀 더 큰 오버헤드를 갖고 있기 때문에.


이것이 의미하는게 걱정 할 만한일인가? 아니다, 심지어 상대적으로 원초적인 해시방법을 쓰더라도 좋은 결과를 얻을 것 이다.

 

만약에 키를 string으로 쓰고 있다면 충분하고도 남는다. 만약에 간단한 빌트인타입을 사용하고 있다면 그건 더 좋을 것이다.

 

 

만약에 딕셔너리 안에서 데이터를 찾는데 오래 걸린 다는 것을 발견 한다면, GetHashCode()하는 방법을 고치거나 IEqualityComparere(외부에서 GetHashCode(),Equals()를 정의)를 만들면 된다.

 

 

하여튼 3000개는 아무것도 아니고, 괜찮을 것이다.


'프로그래밍 > C#' 카테고리의 다른 글

var  (0) 2018.04.11
캘린더  (0) 2018.03.28
C# 자료구조 정리  (0) 2018.03.24
Stack 구현  (0) 2018.03.21
try catch 성능  (0) 2018.03.21
Posted by JinFluenza
프로그래밍/C#2018. 3. 24. 21:01

http://namoeye.tistory.com/entry/C-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%A0%95%EB%A6%AC%EC%A2%80



Dictionary가 Chaining 방식을 사용한다고 한다.  ㅇㅋ

'프로그래밍 > C#' 카테고리의 다른 글

캘린더  (0) 2018.03.28
C# Dictionary의 성능에 대해서.  (0) 2018.03.25
Stack 구현  (0) 2018.03.21
try catch 성능  (0) 2018.03.21
using , Dispose()  (0) 2018.03.21
Posted by JinFluenza
프로그래밍/C#2018. 3. 21. 16:51
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class MyStack<T>
    {
        private class Node<T>
        {
            public T Data { get; }
            public Node<T> next;
            public Node(T data)
            {
                Data = data;
            }
        }
 
        private Node<T> head;
        public int Count { get; private set; }
 
        public void Push(T data)
        {
            Console.WriteLine(string.Format("{0} Pushed", data));
            Node<T> pushData = new Node<T>(data);
            pushData.next = head;
            head = pushData;
            Count++;
        }
 
        public T Pop()
        {
            if (head == null)
                throw new Exception("비어있음");
            else
            {
                Node<T> returnNode = head;
                head = head.next;
 
 
                Console.WriteLine(string.Format("{0} Poped", returnNode.Data));
                Count--;
                return returnNode.Data;
 
            }
        }
 
        public void PrintAll()
        {
            Console.WriteLine("Count = " + Count);
 
            Node<T> current = head;
            while (current != null)
            {
                Console.WriteLine(current.Data);
                current = current.next;
            }
        }
 
 
    }
cs


단일 연결리스트를 이용해서 구현.

'프로그래밍 > C#' 카테고리의 다른 글

C# Dictionary의 성능에 대해서.  (0) 2018.03.25
C# 자료구조 정리  (0) 2018.03.24
try catch 성능  (0) 2018.03.21
using , Dispose()  (0) 2018.03.21
퀵소트  (0) 2018.03.15
Posted by JinFluenza
프로그래밍/C#2018. 3. 21. 15:40

https://stackoverflow.com/questions/1350264/try-catch-performance

'프로그래밍 > C#' 카테고리의 다른 글

C# 자료구조 정리  (0) 2018.03.24
Stack 구현  (0) 2018.03.21
using , Dispose()  (0) 2018.03.21
퀵소트  (0) 2018.03.15
가중치 랜덤 생성  (0) 2018.03.13
Posted by JinFluenza