code

Linq 쿼리 그룹화 및 첫 번째 항목 선택

codestyles 2020. 12. 27. 10:54
반응형

Linq 쿼리 그룹화 및 첫 번째 항목 선택


다음과 같은 String 배열이 있습니다.

// icon, category, tool
String[,] subButtonData = new String[,]
{
    {"graphics/gui/brushsizeplus_icon", "Draw", "DrawBrushPlus"},
    {"graphics/gui/brushsizeminus_icon", "Draw", "DrawBrushMinus"},
    {"graphics/gui/freedraw_icon", "Draw", "DrawFree"},
    {"graphics/gui/linedraw_icon", "Draw", "DrawLine"},
    {"graphics/gui/rectangledraw_icon", "Draw", "DrawRectangle"},
    {"graphics/gui/ellipsedraw_icon", "Draw", "DrawEllipse"},
    {"graphics/gui/brushsizeplus_icon", "Brusher", "BrusherBrushPlus"},
    {"graphics/gui/brushsizeminus_icon", "Brusher", "BrusherBrushMinus"},
    {"graphics/gui/brushsizeplus_icon", "Text", "TextBrushPlus"},
    {"graphics/gui/brushsizeminus_icon", "Text", "TextBrushMinus"},
};

그런 다음 List<Button>버튼 유형을mainButtons

이것이 내가 그룹화를 쿼리하는 방법입니다 Category.

var categories = from b in mainButtons
                 group b by b.category into g
                 select new { Category = g.Key, Buttons = g };

메인 목록에서 각 그룹의 첫 번째 항목을 어떻게 선택할 수 있습니까? (각각을 반복하고 다른 목록에 추가하지 않고?)


LINQ : Group by 절을 사용하여 최신 / 마지막 레코드를 가져 오는 방법을 참조하세요 .

var firstItemsInGroup = from b in mainButtons
                 group b by b.category into g
select g.First();

mainButtons가 이미 올바르게 정렬되었다고 가정합니다.

사용자 지정 정렬 순서를 지정해야하는 경우 Comparer와 함께 OrderBy 재정의를 사용합니다.

var firstsByCompareInGroups = from p in rows
        group p by p.ID into grp
        select grp.OrderBy(a => a, new CompareRows()).First();

내 게시물 "Select First Row In Group using Custom Comparer " 의 예를 참조하십시오.


var result = list.GroupBy(x => x.Category).Select(x => x.First())

var results = list.GroupBy(x => x.Category)
            .Select(g => g.OrderBy(x => x.SortByProp).FirstOrDefault());

반드시 올바르게 정렬 되지 않은 그룹에 대해이 작업을 수행하는 방법을 궁금해하는 사람들 을 위해 메서드 구문을 사용하여 각 그룹의 정렬 순서를 사용자 지정하여 각각에서 원하는 레코드를 가져 오는 이 답변 의 확장 있습니다.

참고 : LINQ-to-Entities를 사용하는 경우 여기에서 FirstOrDefault () 대신 First ()를 사용하면 전자가 최종 쿼리 작업으로 만 사용될 수 있으므로 런타임 예외가 발생합니다.


우선, 저는 다차원 배열을 사용하지 않을 것입니다. 나쁜 일이 발생하는 것을 본 적이 없습니다.

다음과 같이 변수를 설정하십시오.

IEnumerable<IEnumerable<string>> data = new[] {
    new[]{"...", "...", "..."},
    ... etc ...
};

그런 다음 간단히 이동합니다.

var firsts = data.Select(x => x.FirstOrDefault()).Where(x => x != null); 

Where는 내부 항목으로 빈 목록이있는 경우 null을 제거합니다.

또는 다음과 같이 구현할 수 있습니다.

string[][] = new[] {
    new[]{"...","...","..."},
    new[]{"...","...","..."},
    ... etc ...
};

이것은 [x,y]배열 과 유사하게 사용할 수 있지만 다음과 같이 사용됩니다.[x][y]

ReferenceURL : https://stackoverflow.com/questions/6963707/linq-query-group-by-and-selecting-first-items

반응형