IT story

linq를 사용하여 구별 선택

hot-time 2020. 4. 16. 08:31
반응형

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 만 선택하면됩니다. 즉, 내 결과 목록에는

[{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

즉,의 반복이있는 경우 id결과는 첫 번째 항목 만 수행해야합니다.


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

편집 : 이것을 많은 사람들에게 미스터리 IEnumerable<>로 만드는 List<>것처럼 간단하게 작성할 수 있습니다.

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

그러나 위의 Linq가 느리게 평가 되는 IEnumerable것보다 오히려 작업하는 것이 더 낫습니다 IList. 열거 형이 반복 될 때까지 실제로 모든 작업을 수행하지는 않습니다. 당신이 전화 ToList하면 실제로 모든 작업이 선행되도록 강제로 열거 할 수 있는 전체를 걸어갑니다. 열거 형이 무한히 길면 시간이 조금 걸릴 수 있습니다.

이 조언의 IEnumerable단점은 평가할 작업을 열거 할 때마다 새로 작성해야한다는 것입니다. 당신은이 게으르게 평가와 함께 작업하는 것이 좋습니다 여부를 각각의 경우에 대해 결정해야합니다 그래서 IEnumerable나에 그것을 실현하기 위해 List, Set, Dictionary또는 이것 저것.


morelinq사용 하면 다음을 사용할 수 있습니다 DistinctBy.

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

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

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

이 경우 ID를 비교하려면 무시 Equals하고 GetHashCode의미 가 있어야합니다 .

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

반응형