programing

linq를 사용하여 고유 선택

powerit 2023. 5. 8. 22:28
반응형

linq를 사용하여 고유 선택

나는 수업 목록을 가지고 있습니다.

public class LinqTest
{
public int id { get; set; }
public string value { get; set; }
}


List<LinqTest> myList = new List<LinqTest>();
myList.Add(new LinqTest() { id = 1, value = "a" });
myList.Add(new LinqTest() { id = 1, value = "b" });
myList.Add(new LinqTest() { id = 2, value = "c" });

저는 그 목록에서 고유 ID만 선택하면 됩니다.i, 내 결과 목록은 다음만 포함해야 합니다.

[{id=1,value="a"},{ id = 2, value = "c" }]

linq로 이걸 어떻게 하나요?

편집

입력,

id      value
1        a
1        b
2        c
3        d
3        e

출력은 다음과 같아야 합니다.

id      value
1        a
2        c
3        d

i, 의 반복이 있을 경우id결과는 첫 번째 항목만 사용해야 합니다.

myList.GroupBy(test => test.id)
      .Select(grp => grp.First());

편집: 가져올 때IEnumerable<>의 상태가.List<>많은 사람들에게 미스터리처럼 보입니다. 당신은 간단하게 다음과 같이 쓸 수 있습니다.

var result = myList.GroupBy(test => test.id)
                   .Select(grp => grp.First())
                   .ToList();

하지만 종종 한 명은 더 나은 방법으로 작업합니다.IEnumerable보다는IList위의 Linq는 게으르게 평가됩니다. 열거형이 반복될 때까지 실제로 모든 작업을 수행하지 않습니다.전화할 때ToList실제로 모든 작업을 사전에 완료하도록 강제하는 전체 열거형 워크입니다. (그리고 열거형이 무한히 길면 시간이 조금 걸릴 수 있습니다.)

이 충고의 반대되는 점은 당신이 그러한 것을 열거할 때마다IEnumerable그것을 평가하는 일은 다시 해야 합니다.따라서 각 사례에 대해 게으르게 평가된 작업을 수행하는 것이 더 나은지 여부를 결정해야 합니다.IEnumerable또는 그것을 실현하기 위해.List,Set,Dictionary뭐 그런 거.

사용할 수 있는 더 많은 링크 사용DistinctBy:

myList.DistinctBy(x => x.id);

그렇지 않으면 그룹을 사용할 수 있습니다.

myList.GroupBy(x => x.id)
      .Select(g => g.First());

오버라이드해야 합니다.Equals그리고.GetHashCode의미 있게, 이 경우 ID를 비교합니다.

public class LinqTest
{
    public int id { get; set; }
    public string value { get; set; }

    public override bool Equals(object obj)
    {
        LinqTest obj2 = obj as LinqTest;
        if (obj2 == null) return false;
        return id == obj2.id;
    }

    public override int GetHashCode()
    {
        return id;
    }
}

이제 사용할 수 있습니다.Distinct:

List<LinqTest> uniqueIDs = myList.Distinct().ToList();
myList.GroupBy(i => i.id).Select(group => group.First())

언급URL : https://stackoverflow.com/questions/19406242/select-distinct-using-linq

반응형