Linq를 사용하여 객체 목록에서 고유 한 속성 목록을 얻으려면 어떻게해야합니까?


171

Linq를 사용하여 id가 속성 인 객체 목록이 제공된 id 목록을 반환하려고합니다. 각 객체를 반복하고 찾은 고유 ID를 가져 오지 않고이 작업을 수행하고 싶습니다.

MyClass 유형의 객체 목록이 있으며이 클래스의 속성 중 하나가 ID입니다.

public class MyClass
{
  public int ID { get; set; }
}

내가하고 싶은 것은 Linq 쿼리를 작성하여 해당 ID 목록을 반환하는 것입니다.

id를 IList<MyClass>반환하도록 어떻게해야 IEnumerable<int>합니까?

MyClass 목록의 각 항목을 반복하고 고유 값을 목록에 추가하는 대신 Linq를 사용하여 한 줄 또는 두 줄로 수행 할 수 있어야합니다.

우아한 솔루션을 만드는 데 도움을 주시면 감사하겠습니다.


1
또한 당신이 한주의 DistinctByMoreLinq 당신에게 별개의 줄 것이다 MyClass기반으로들 ID. 사용법 :var distincts = list.DistinctBy(x => x.ID);
nawfal

답변:


319
IEnumerable<int> ids = list.Select(x=>x.ID).Distinct();

와! 나는 그것이 단순한 무언가라고 생각했다. 나는 단지 그것을 생각할 수 없었다. Linq에 익숙해 지려면 더 많은 시간을 할애해야 할 것 같습니다.
mezoid

29

고유 연산자를 사용하십시오 .

var idList = yourList.Select(x=> x.ID).Distinct();

5
(사소한 이름 지정; ID의 "목록"이 아닙니다. 느리게 평가 된 IEnumerable <int>입니다. 물론 .ToList ()를 호출하지 않으면 ;-p)
Marc Gravell

@Marc, 게으른 eval의 간단한 2 라인 이식? 감사합니다 : D
masfenix

2
@masfenix Lazy eval은 실제로 사용될 때까지 작업이 수행되지 않음을 의미합니다. 이 경우이 답변의 명령문이 실행될 때 ID를 선택하고 고유 한 ID 만 선택하는 것은 아닙니다. 실제로 foreach 루프와 같이 idList를 통과하기 시작할 때 수행됩니다.
Mark Meuer

13

확장자 가있는 스트레이트 Linq 사용 Distinct():

var idList = (from x in yourList select x.ID).Distinct();

3
        int[] numbers = {1,2,3,4,5,3,6,4,7,8,9,1,0 };
        var nonRepeats = (from n in numbers select n).Distinct();


        foreach (var d in nonRepeats)
        {

            Response.Write(d);
        }

산출

1234567890


1
질문에 대답하지 않으며, 그래도 새로운 것을 추가하지 않습니다.
nawfal

2

구별을 할 때 우리는 IEnumerable에도 캐스팅해야합니다. list가 모델 수단 인 경우 다음과 같은 코드를 작성해야합니다.

 IEnumerable<T> ids = list.Select(x => x).Distinct();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.