성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[양승조] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
[정성태] 만드실 수 있습니다. 단지, Unity 엔진 내의 스크립트와 W...
[공진영] 안녕하세요 좋은글 감사합니다. 현재 제가 wpf로 관제 모...
[정성태] The Windows Registry Adventure #1: ...
[정성태] systemd for Developers I ; https:/...
[정성태] 엄밀히 object 타입의 인스턴스가 다른 타입으로 형변환 가능...
[정성태] 아래의 글에서 나오는 "Windows Application Pa...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>C# - Python range 함수 구현 (2) INumber<T>를 이용한 개선</h1> <p> 다음의 기능이 나왔으니,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > .NET 6 Preview 7에 추가된 숫자 형식에 대한 제네릭 연산 지원 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12785'>https://www.sysnet.pe.kr/2/0/12785</a> </pre> <br /> 이제 Python의 Range 함수를,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C# - Python range 함수 구현 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/11908'>https://www.sysnet.pe.kr/2/0/11908</a> </pre> <br /> 더 매끄럽게 구현할 수 있습니다. ^^ 이렇게!<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > public static IEnumerable<T> Range<T>(T start, T stop, T step = default) where T: INumber<T> { if (step == default) { step = T.One; } if (start < stop && step > T.Zero) { for (var i = start; i < stop; i += step) { yield return i; } } else if (start > stop && step < T.Zero) { for (var i = start; i > stop; i += step) { yield return i; } } } </pre> <br /> dynamic을 쓸 필요도 없고 unmanaged 제약으로 unsafe를 쓸 필요도 없어졌습니다. 당연히 출력 결과도 기존의 코드와 완전히 동일합니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > static void Main(string[] args) { { var expected = <span style='color: blue; font-weight: bold'>Extension.RangePython<int>(1, 10, 1);</span> // 기존 방식 var results = <span style='color: blue; font-weight: bold'>Extension.Range(1, 10);</span> // 새로운 방식 foreach (var item in results.Zip(expected, (first, second) => Tuple.Create(first, second))) { Console.WriteLine($"{item.Item1} == {item.Item2}: {item.Item1 == item.Item2}"); } } Console.WriteLine(); { var expected = <span style='color: blue; font-weight: bold'>Extension.RangePython<double>(0.1, .13, 0.001);</span> // 기존 방식 var results = <span style='color: blue; font-weight: bold'>Extension.Range(0.1, .13, 0.001);</span> // 새로운 방식 foreach (var item in results.Zip(expected, (first, second) => Tuple.Create(first, second))) { Console.WriteLine($"{item.Item1} == {item.Item2}: {item.Item1 == item.Item2}"); } } } /* 출력 결과 1 == 1: True 2 == 2: True 3 == 3: True 4 == 4: True 5 == 5: True 6 == 6: True 7 == 7: True 8 == 8: True 9 == 9: True 0.1 == 0.1: True 0.101 == 0.101: True 0.10200000000000001 == 0.10200000000000001: True 0.10300000000000001 == 0.10300000000000001: True 0.10400000000000001 == 0.10400000000000001: True 0.10500000000000001 == 0.10500000000000001: True 0.10600000000000001 == 0.10600000000000001: True 0.10700000000000001 == 0.10700000000000001: True 0.10800000000000001 == 0.10800000000000001: True 0.10900000000000001 == 0.10900000000000001: True 0.11000000000000001 == 0.11000000000000001: True 0.11100000000000002 == 0.11100000000000002: True 0.11200000000000002 == 0.11200000000000002: True 0.11300000000000002 == 0.11300000000000002: True 0.11400000000000002 == 0.11400000000000002: True 0.11500000000000002 == 0.11500000000000002: True 0.11600000000000002 == 0.11600000000000002: True 0.11700000000000002 == 0.11700000000000002: True 0.11800000000000002 == 0.11800000000000002: True 0.11900000000000002 == 0.11900000000000002: True 0.12000000000000002 == 0.12000000000000002: True 0.12100000000000002 == 0.12100000000000002: True 0.12200000000000003 == 0.12200000000000003: True 0.12300000000000003 == 0.12300000000000003: True 0.12400000000000003 == 0.12400000000000003: True 0.12500000000000003 == 0.12500000000000003: True 0.12600000000000003 == 0.12600000000000003: True 0.12700000000000003 == 0.12700000000000003: True 0.12800000000000003 == 0.12800000000000003: True 0.12900000000000003 == 0.12900000000000003: True </pre> <br /> (<a target='tab' href='https://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=1843&boardid=331301885'>첨부 파일은 이 글의 예제 코드를 포함</a>합니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그런데, 한 가지 아쉬운 것이 있군요. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > public static IEnumerable<T> Range<T>(T start, T stop, <span style='color: blue; font-weight: bold'>T step = default</span>) where T: INumber<T> { <span style='color: blue; font-weight: bold'>if (step == default) { step = T.One; }</span> // ...[생략]... } </pre> <br /> 위의 코드에서 T step의 기본값을 default로 주었는데, 원래는 다음과 같이 설정할 수 있었으면 더 좋았을 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > public static IEnumerable<T> Range<T>(T start, T stop, <span style='color: blue; font-weight: bold'>T step = T.One</span>) where T: INumber<T> </pre> <br /> 하지만, 메서드 선언에서의 문맥 단계에서는 T에 대한 풀이를 아직 제공하지 않는 것인지(혹은 못하는 것인지) 현재는 다음과 같은 컴파일 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > error CS0103: The name 'T' does not exist in the current context </pre> <br /> 이것만 더해진다면 완벽하지 않을까... 싶군요. ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1461
(왼쪽의 숫자를 입력해야 합니다.)