NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# C# .NET 매크로 프로그램 만들기. (배열 정렬하기 2부)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 오늘은 배열 정렬하기 2부입니다. 앞서 1부에서 오름차순과 내림차순 그리고, 역순과 랜덤을 알아봤는데요. 오늘은 특정 값에서 가깝거나 먼 순서로 정렬하는 방법을 추가 개발 해볼께요. 우선, 이전에 개발했던 배열 정렬 모델을 열고, Far와 Near의 case에 코딩을 해줘야 합니다.

     

    아래와 같이 정렬 방법을 Far, Near로 선택하면 기준이 되는 값들이 필요합니다.

    B2iYHUs.png

     

     

    정렬 방법의 기준 값들은 아래와 같이 속성으로 제공해줍니다.

    [LocalizedCategory("SortOption")]
    [LocalizedDisplayName("NearFarPoint")]
    [LocalizedDescription("NearFarPoint")]
    [Browsable(true)]
    [DefaultValue(typeof(Point), "0, 0")]
    [Editor(typeof(TypeEditor.MouseTrackingEditor), typeof(System.Drawing.Design.UITypeEditor))]
    public Point NearFarPoint { get; set; }
    
    [LocalizedCategory("SortOption")]
    [LocalizedDisplayName("NearFarSize")]
    [LocalizedDescription("NearFarSize")]
    [Browsable(true)]
    [DefaultValue(typeof(Size), "0, 0")]
    public Size NearFarSize { get; set; }
    
    [LocalizedCategory("SortOption")]
    [LocalizedDisplayName("NearFarRectangle")]
    [LocalizedDescription("NearFarRectangle")]
    [Browsable(true)]
    [DefaultValue(typeof(Rectangle), "0, 0, 0, 0")]
    public Rectangle NearFarRectangle { get; set; }
    
    [LocalizedCategory("SortOption")]
    [LocalizedDisplayName("NearFarText")]
    [LocalizedDescription("NearFarText")]
    [Browsable(true)]
    [DefaultValue(null)]
    [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
    public string? NearFarText { get; set; }
    
    [LocalizedCategory("SortOption")]
    [LocalizedDisplayName("NearFarNumber")]
    [LocalizedDescription("NearFarNumber")]
    [Browsable(true)]
    [DefaultValue(null)]
    [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
    public double? NearFarNumber { get; set; }

     

    이전 시간에 만든 텍스트 유사도를 이용하면 텍스트의 경우에는 쉽게 특정 값과 얼마나 유사한지에 따라서 정렬할 수 있습니다. 이 내용을 만들기 위해서 배열 강좌를 하다가 중간에 텍스트 유사도와 관련된 액션을 먼저 개발했습니다. 아무래도 코드를 재사용하는게 좋으니까요.

    case Definition.Sort.Far:
        Dictionary<double, string> keyValuePairs = new Dictionary<double, string>();
        var similaity = new TextSimilarityCheckModel();
        similaity.LeftValue = NearFarText;
    
        foreach (var arr in arrText)
        {
            similaity.RightValue = arr;
            similaity.Execute(player);
            keyValuePairs.Add(similaity.MatchRateResult, arr);
        }
    
        Result = keyValuePairs.OrderBy(o => o.Key).Select(s => s.Value).ToArray();
        break;
    case Definition.Sort.Near:
        keyValuePairs = new Dictionary<double, string>();
        similaity = new TextSimilarityCheckModel();
        similaity.LeftValue = NearFarText;
    
        foreach (var arr in arrText)
        {
            similaity.RightValue = arr;
            similaity.Execute(player);
            keyValuePairs.Add(similaity.MatchRateResult, arr);
        }
    
        Result = keyValuePairs.OrderByDescending(o => o.Key).Select(s => s.Value).ToArray();
        break;

     

    숫자는 아래와 같이 정렬할 수 있습니다. 람다식을 이용하면 아래와 같이 처리할 수 있습니다. 텍스트보다는 훨씬 간단하죠?

    case Definition.Sort.Far:
        Result = arrNumber.OrderByDescending(i => Math.Abs((decimal)(i - NearFarNumber)))
                     .ThenBy(i => i < NearFarNumber)
                     .Select(s => s.ToString())
                     .ToArray();
        break;
    case Definition.Sort.Near:
        Result = arrNumber.OrderBy(i => Math.Abs((decimal)(i - NearFarNumber)))
                     .ThenBy(i => i < NearFarNumber)
                     .Select(s => s.ToString())
                     .ToArray();
        break;

     

    이제 응용 부분입니다. 위에서 숫자를 특정 숫자와 비교해서 가깝거나 먼 순서로 배치하는걸 배웠습니다. 그러면, 쉽게 응용해서 좌표와 크기 그리고, 사각형까지 모두 개발할 수 있습니다. 어차피 좌표의 X와 Y도 숫자고 크기의 Width와 Height도 숫자이기 때문입니다. 그리고, 사각형의 경우에는 크기와 좌표를 모두 가지고 있기 때문에 지금까지 만든 내용을 모두 합쳐주면 됩니다.

     

    특정 값과 가깝거나 먼 순서로 정렬하는 기능이 필요한지는 잘 모르겠습니다. 그리고, 어디에 어떻게 사용될지도요. 일반적으로 개발 방법론에서 말하는 하지 말아야 할 개발들이 있는데요. 요구 사항이 없는데 미리 예상해서 이것저것 덕지덕지 개발하는걸 우려하고 있습니다. 어떻게 보면 Near, Far 정렬도 그런축에 낄 수 있을지도 모르겠네요. 하지만, 크게 시간이나 노력이 들어가는건 아니라서 일단 미리 구현을 해두었습니다. 그리고, 엔지엠 6 버전에도 있는 기능이라서 빼기는 좀 그렇더라고요^^;

     

    이제 테스트를 해볼텐데요. 아래 동영상을 참고해서 다양한 케이스를 테스트 해보세요.

     

     

    이 글이 도움이 되셨다면~ 커피 한잔이라도 후원 부탁드립니다^^

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.