Linq를 사용하여 각 그룹에서 첫 번째 레코드를 얻는 방법


133

다음 기록을 고려하십시오.

   Id          F1            F2             F3 
 -------------------------------------------------
   1           Nima          1990           10
   2           Nima          1990           11
   3           Nima          2000           12
   4           John          2001           1
   5           John          2002           2 
   6           Sara          2010           4

F1필드 를 기준으로 그룹화 하고 정렬 Id하여 다음 레코드와 비슷한 그룹의 첫 번째 레코드에서 모든 필드를 가져옵니다.

   Id          F1            F2             F3 
 -------------------------------------------------
   1           Nima          1990           10
   4           John          2001           1
   6           Sara          2010           4

linq를 사용하여 어떻게 할 수 있습니까?

답변:


127
    var res = from element in list
              group element by element.F1
                  into groups
                  select groups.OrderBy(p => p.F2).First();

4
나는 이것을 발견해서 기쁘다. " 'First'메서드는 최종 쿼리 작업으로 만 사용할 수 있습니다. 대신이 인스턴스에서 'FirstOrDefault'메서드를 사용해보십시오."오류 메시지가 나타납니다. 당신의 예에서. 쿼리가 myResult.ToList ()를 메서드에 전달한 후에 목록에서 작업 만 수행했습니다. FirstOrDefault를 사용하면 문제가 해결되었습니다
aghost

이겠습니까 OrderBy(p => p.Id), 그들은 ID하지 올해 열을 기준으로 정렬 싶었다.
Mike Flynn 2016 년

다음에 대한 지원을 제공해 주실 수 있습니까 : stackoverflow.com/questions/44764687/…
Si8

그룹에서 첫 번째 항목과 마지막 항목을 검색하려면 어떻게합니까?
Sandeep Pandey

176
var result = input.GroupBy(x=>x.F1,(key,g)=>g.OrderBy(e=>e.F2).First());

2
이것은 Fluent 구문을 사용하는 방법을 보여주었습니다. GroupBy과부하 는 많은 학습 능력을 제공하는 것으로 보입니다. 긴 학습 목록에 추가 할 수 있습니다!
rogersillito

1
@rogersillito가 쿼리라고하는 이유의가 (언어 통합 쿼리 - LINQ)이 있음을, 또한 GROUPBY 많은 과부하를 가지고 있지만 등을 작성하는 것을 선호 등 몇 가지 것들로, 일반적으로, 또한 개인 취향에 따라 사용되는 몇 가지 존재가있다 .GroupBy(x=>x.F1).Select(g=>...), 이해하기 쉬워 보일 수 있습니다.
King King

11
다음 .First()과 같이 교체 .FirstOrDefault()하거나 예외를 받으십시오.The method 'First' can only be used as a final query operation. Consider using the method 'FirstOrDefault' in this instance instead.
Nikolay Kostov

5
@NikolayKostov 나는 그것에 대해 알고 있지만 여기서 LINQ는 LINQ-to-entities가 아니라 LINQ-to-object로 사용된다고 가정하므로 안전하게 사용할 수 있습니다 .First(). OP의 질문은 실제로 linq-to-object에 관심이있는 것처럼 보이지만 질문에 태그를 달았습니다 linq-to-entities(그가 무엇인지 이해했는지 확실하지 않음).
킹 킹

1
나는이 답변을 좋아했다.
Ajas Aju

8

@Alireza의 천막은 완전히 정확하지만이 코드를 사용할 때주의해야합니다

var res = from element in list
          group element by element.F1
              into groups
              select groups.OrderBy(p => p.F2).First();

목록을 주문한 다음 그룹화를 수행하여 그룹의 첫 번째 행을 가져 오기 때문에이 코드와 유사합니다.

var res = (from element in list)
          .OrderBy(x => x.F2)
          .GroupBy(x => x.F1)
          .Select()

이제 동일한 그룹화 결과를 얻는 것과 같이 더 복잡한 것을 원하지만 F2의 첫 번째 요소와 F3의 마지막 요소 또는 더 많은 사용자 정의를 취하는 경우 코드를 스터드하여 수행 할 수 있습니다

 var res = (from element in list)
          .GroupBy(x => x.F1)
          .Select(y => new
           {
             F1 = y.FirstOrDefault().F1;
             F2 = y.First().F2;
             F3 = y.Last().F3;
           });

그래서 당신은 같은 것을 얻을 것입니다

   F1            F2             F3 
 -----------------------------------
   Nima          1990           12
   John          2001           2
   Sara          2010           4

새 개체의 구분 기호 또는 구분 기호는 세미콜론이 아닌 쉼표 여야합니다. 확인하십시오.
Naredla Nithesh Reddy 2016 년

3

원하는 것을 달성하기 위해 그것을 사용하십시오. 그런 다음 반환 할 속성을 결정하십시오.

yourList.OrderBy(l => l.Id).GroupBy(l => new { GroupName = l.F1}).Select(r => r.Key.GroupName)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.