12월, 2018의 게시물 표시

[WPF] 공공데이터 포털 API 이용 클라이언트 구현 Part 3

이미지
그룹핑 ListViewItem 그룹핑 할 수 있습니다. 먼저 CheckBox에 Checked 이벤트를 통해 그룹핑을 추가하고 RemoveChecked 이벤트를 통해 그룹핑을 제거 할 수 있도록 CheckBox를 선언 합니다. 1: <!-- Group CheckBox --> 2: <CheckBox Grid.Column="0" 3: Grid.Row="0" 4: Checked="AddGrouping" 5: Unchecked="RemoveGrouping">Group by Name</CheckBox> 그룹 스타일 선언 GroupStyle 속성에 ContainerStyle 속성을 이용해 Style을 지정 합니다. Expander 컨트롤을 이용해 아파트명과 그룹 아이템의 개수를 Expander Header에 표시 하도록 ControlTemlate를 선언 합니다. 1: <!-- Group Style --> 2: <ListView.GroupStyle> 3: <GroupStyle> 4: <GroupStyle.ContainerStyle> 5: <Style TargetType="{x:Type GroupItem}"> 6: <Setter Property="Margin" Value="0,0,0,5" /> 7: <Setter Property="Te...

[WPF] 대출 이자 계산 툴

이미지
대출 이자 계산 툴 대출을 받을 일이 생겼습니다..ㅠㅠ  이자 계산, 상환 방법이 여러가지가 있어 공부할 겸 툴로 구현해 보겠습니다. 개발 환경 C# WPF 상환 방법 종류로는: 원금 균등 상환 원리금 균등 상환 이 있습니다. 이자 계산 툴의 가장 중요한 부분인 두 상환 방법을 구현한 코드부터 작성 하겠습니다. 1: /// <summary> 2: /// 원금 균등 상환방식 3: /// </summary> 4: /// <param name="loanMoney"></param> 5: /// <param name="loanTerm"></param> 6: /// <param name="interestRate"></param> 7: /// <returns></returns> 8: private List<RepaymentItem> PrincipalRepayment(double loanMoney, int loanTerm, double interestRate) 9: { 10: List<RepaymentItem> repayments = new List<RepaymentItem>(); 11: 12: double left = loanMoney; 13: // 원금 14: double payment = Math.Round(loanMoney / loanTerm); 15: // 대출 이자율(연이자율/12), 소수점 6자리 16: double yearInterest = Math.Round(interestRate / YearOfMonthCou...

[WPF] 날짜 계산 툴

이미지
WPF를 이용해 네이버가 제공하는 날짜 계산 기능을 구현해 보려 합니다. (날짜 계산은 기준일을 1일로 포함 하여 계산 됩니다) 위와 비슷한 형태로 구현을 하기 위해 필요한 기능이 무엇인지 확인 해볼께요. 달력에서 날짜 선택 시 [기준년월일]에 자동 입력 [기준년월일] 유효성 검사 [기준년월일]로 부터 날짜 더하기 [기준년월일]로 부터 날짜 빼기 [기준년월일]로 부터 기간 구하기 이렇게 필요할 듯 합니다. 이제 하나 하나 알아보도록 하겠습니다. 달력에서 날짜 선택 시 [기준년월일]에 자동 입력 Calendar 컨트롤과 기준년월일 입력에 필요한 텍스트 박스를 XAML 마크업을 이용해 선언 한 뒤 Calendar 컨트롤에서 SelectedDatesChanged 이벤트를 등록 합니다. 1: <Calendar x:Name="calendar" BorderThickness="0" SelectedDatesChanged="Calendar_SelectedDatesChanged"/> 유저가 날짜 선택 시 기준년월일에 선택 된 날짜를 텍스트 박스 Text 속성에 대입합니다. 1: /// <summary> 2: /// 달력 컨트롤의 선택 날짜가 변경 되었을 경우 지정일에 선택된 날짜를 입력 합니다. 3: /// </summary> 4: /// <param name="sender"></param> 5: /// <param name="e"></param> 6: private void Calendar_SelectedDatesChanged(object sender, SelectionChangedEventArgs e) 7: { 8: if (calendar.Selecte...

[알고리즘] 버블 정렬, 선택 정렬, 삽입 정렬

-버블 정렬 1: /// <summary> 2: /// 버블 정렬로 정렬 합니다. 3: /// </summary> 4: public void BubbleSort() 5: { 6: // 배열의 마지막 인덱스 7: int index = count - 1; 8: // 정렬이 정렬 여부 9: bool sorted = false; 10: 11: // 정렬이 완료 될 때 까지 실행 12: while (!sorted) 13: { 14: sorted = true; 15: 16: // 배열의 첫 인덱스 부터 정렬이 않은 인덱스까지 반복 17: for (int i = 0; i < index; i++) 18: { 19: // 인접한 값 쌍을 비교하고 순서가 뒤바뀌어 있으면 교환 20: if (arr[i] > arr[i + 1]) 21: { 22: sorted = false; 23: int prevData = arr[i]; 24: arr[i] = arr[i + 1]; 25: arr[i + 1] = prevData; 26: } 27: } 28: 29: // 패스스루를 하나 완료했으면 오른쪽으로 올려준 값(버블)이 정렬 되었다는 것을 확신 30: // 기존에 가르키고 있던 인덱스가 정렬된 상태이므로 index 값을 1 감소 시킨다. 31: index = index - 1; 32: } 33: ...

[자료구조] 정렬 배열 (Sort Array)

정렬 배열:  데이터가 정렬되어 잇는 것이 특징 선형 자료구조 이진 검색 알고리즘 적용 가능 ✤ 자료구조의 연산에 관련 글은 이전 포스트를 참조해 주세요. ( 링크 ) c#을 이용해 정렬 배열의 삽입, 선형검색, 이진 검색 구현해 보았다. - 내부 배열 선언 1: private const Int32 DefaultSize = 10; 2: private Int32[] arr; 3: private Int32 count; - 삽입 1: /// <summary> 2: /// 데이터를 정렬하여 저장 합니다. 3: /// 최악의 경우 마지막 까지 검색해아 하며 (N), 4: /// 최악의 경우 배열 내 모든 값을 한 칸씩 오른쪽으로 이동 해야 하고 (N) 5: /// 1번의 삽입이 일어 난다 6: /// </summary> 7: /// <param name="value"></param> 8: public void Add(int value) 9: { 10: if (count == DefaultSize) 11: throw new ArgumentOutOfRangeException(); 12: 13: int firstRunner = 0; 14: // 추가 할 데이터 크기보다 큰 값의 인덱스를 찾는다. 15: while (firstRunner < count) 16: { 17: if (arr[firstRunner] > value) 18: break; 19: 20: firstRunner++; 21: } 22: 23: // 추가 데...

[자료구조] 배열 (Array)

배열:  데이터 원소들의 리스트 선형 자료구조 대부분의 자료 구조는 네 가지 기본 방법을 사용하며, 이를 연산 이라 부른다. 읽기: 자료 구조 내 특정 위치를 찾아보는 것 검색: 자료 구조 내에서 특정 값을 찾는 것 삽입: 자료 구조에 새로운 값을 추가하는 것 삭제: 자료 구조에서 삭제 하는 것 c#을 이용해 배열의 연산을 구현해 보았다. ✤ 검색은 삽입, 삭제 알고리즘을 보면 0번째 원소 부터 n번째 원소까지 반복을 하며 일치하는 원소를 삭제 한다. - 내부 배열 선언 1: private const Int32 DefaultSize = 10; 2: private Int32[] arr; 3: private Int32 count; - 읽기 (c# indexer 사용) 1: public int this[int i] 2: { 3: get { return arr[i]; } 4: set { arr[i] = value; } 5: } - 삽입 1: public void Insert(int index, int value) 2: { 3: if (count == DefaultSize) 4: throw new ArgumentOutOfRangeException(); 5: 6: int currentIndex = count - 1; 7: while (currentIndex >= index) 8: { 9: arr[currentIndex + 1] = arr[currentIndex]; 10: 11: if (currentIndex == index) 12: arr[index] = value; 13: 14: currentIndex--; ...

[C#] 명시적으로 Task 생성 및 실행

이 내용은 msdn에 내용을 발췌 한 것입니다. ( https://docs.microsoft.com/ko-kr/dotnet/standard/parallel-programming/task-based-asynchronous-programming ) Task를 생성 할 때는 Task에서 실행 할 코드를 캡슐화하는 사용자 대리자를 지정해야 합니다. 대리자는: 명명된 대리자 익명 메소드 람다식 으로 표현할 수 있습니다. - Task 생성 1: static void Main(string[] args) 2: { 3: Thread.CurrentThread.Name = "Main"; 4: // lambda expression을 이용한 Task 생성 5: Task taskA = new Task(() => Console.WriteLine("Hello from taskA")); 6: // Task 시작 7: taskA.Start(); 8: // 호출 쓰레드에서 출력한 메시지 9: Console.WriteLine("Hello from thread '{0}'.", Thread.CurrentThread.Name); 10: // 응용 프로그램이 종료되기 전에 작업 실행이 완료되도록 Task.Wait 메소드에 호출 11: taskA.Wait(); 12: Console.ReadKey(); 13: } 14: // The example displays output like the following: 15: // Hello from thread 'Main'. 16: // Hello from taskA. - 한 번에 작업을 만들고 시작 1: ...

[C#] Parallel Invoke를 이용한 병렬 작업 실행(암시적 Task 생성)

이미지
아래 샘플 코드는 msdn에서 참고한 코드 입니다. ( https://docs.microsoft.com/ko-kr/dotnet/standard/parallel-programming/how-to-use-parallel-invoke-to-execute-parallel-operations ) 샘플 코드를 먼저 보여드린 후 결과를 토대로 설명 하겠습니다. 샘플 코드의 시나리오 웹 사이트에서 .txt 파일을 다운로드 다운로드 한 .txt 파일의 문자열을 분할 분할 된 문자열 배열에서 병렬로 실행할 작업 등록(GetCountForWord, GetMostCommonWords, GetLongesWord) 별렬 작업 실행 별렬로 실행 할 함수 생성 1: private static void GetCountForWord(string[] words, string term) 2: private static void GetMostCommonWords(string[] words) 3: private static string GetLongesWord(string[] words) Parallel.Invoke() 를 이용한 병렬 작업을 생성 1: // 소스 배열에서 세가지 작업을 실행 2: Parallel.Invoke(() => 3: { 4: Console.WriteLine("Begin first task..."); 5: GetLongesWord(words); 6: }, 7: () => 8: { 9: Console.WriteLine("Begin second task..."); 10: GetMostCommonWords(words); 11: }, 12: () =...