Distinct()내 장 된 방법 으로 List 집합 에 대한 무 거 운 문제 에 대한 상세 한 설명
집합 에 대한 재 처리 라 고 하면 가장 먼저 생각 나 는 것 은 Linq 의 Distinct 확장 방식 입 니 다.일반적인 값 유형 에 대한 집합 은 재 처리 하기 쉽 습 니 다.직접 list.Distinct()를 사용 하면 됩 니 다.그러나 인용 유형의 집합 을 다시 하려 면(속성 값 이 같 으 면 중복 이 라 고 생각 합 니 다)직접 Distinct()는 안 됩 니 다.
먼저 팬 링크 List
public class List
이 를 통 해 알 수 있 듯 이 IEnumerable
이 방법 을 사용 할 때 주의해 야 한다.
(1)이 방법 은 원래 의 링크 를 바 꾸 지 않 는 다.
(2)이 방법 은 대상(dis 라 고 가정)을 되 돌려 줍 니 다.이 대상 을 통 해 원 링크 의 비 중복 요 소 를 매 거 할 수 있 지만 비 중복 요 소 를 새로운 대상 에 복사 하지 않 았 습 니 다(복사 도 하지 않 았 습 니 다)
(3)(2)dis 를 매 거 할 때 항상 기 존 링크 에 의존 하기 때문에 dis 를 얻 은 후에 기 존 링크 를 업데이트 하면 dis 매 거 진 을 사용 하면 기 존 링크 의 최신 상 태 를 사용 합 니 다.
var list=new List<SampleVersionDto>()/// 때때로 Distinct()가 인용 형식 을 다시 사용 할 수 없 을 때 사용자 정의 코드 는 다음 과 같 습 니 다.
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
var list = new List<User>()
{
new User() { Id = 1, Name = " " } ,
new User() { Id = 1, Name = " " } ,
new User() { Id = 3, Name = " " } ,
};
var newList1 = list.Distinct().ToList();위 코드 를 실행 하면 원 하 는 결과 가 아니 라 new List 1 에 3 개의 요소 가 있 음 을 알 수 있 습 니 다.이러한 결과 가 발생 하 는 이 유 는 Distinct()가 기본 적 인 비교 기 를 사용 하여 값 을 비교 하여 시퀀스 의 비 중복 요 소 를 되 돌려 주기 때 문 입 니 다.값 유형 에 대해 서 는 기본 적 인 상등 비교 기 가 비교 값 이 같 는 지,인용 유형 에 대해 서 는 기본 적 인 상등 비교 기 가 비교 대상 의 참조 주소 이기 때문에 상기 예 에서 속성 값 이 같 더 라 도 무 게 를 줄 수 없습니다.IEqualityComparer
똑똑 한 우 리 는 Linq 가 우 리 를 위해 무 거 운 방법 을 다시 실 어 주 었 고 우리 의 수 요 를 만족 시 킬 수 있다 는 것 을 쉽게 알 수 있다.
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer);다시 불 러 오 는 이 방법 은 IEquality Comparer
public class UserComparer : IEqualityComparer<User>
{
public bool Equals(User x, User y)
{
return x.Id == y.Id && x.Name == y.Name;
}
public int GetHashCode(User obj)
{
return obj.ToString().GetHashCode();
}
}IEquality Comparer
ar newList2 = list.Distinct(new UserComparer()).ToList();심지어 우 리 는 특정한 속성 이 같 으 면 중복 된다 고 생각 하 는 효 과 를 실현 할 수 있다.Equals 방법 에서 비교 하고 자 하 는 방식 으로 처리 하면 된다.사 고 를 연장 하 다.
Distinct 의 리 셋 방법 은 기본적으로 우리 의 다양한 리 셋 수 요 를 만족 시 킬 수 있 습 니 다.그러나 가 고 싶 어도 어색 합 니 다.바로 비슷 한 리 셋 수요 가 있다 면 우 리 는 IEquality Comparer
public class LambdaComparer<T> : IEqualityComparer<T>
{
private readonly Func<T, T, bool> _lambdaComparer;
private readonly Func<T, int> _lambdaHash;
public LambdaComparer(Func<T, T, bool> lambdaComparer)
: this(lambdaComparer, EqualityComparer<T>.Default.GetHashCode)
{
}
public LambdaComparer(Func<T, T, bool> lambdaComparer, Func<T, int> lambdaHash)
{
if (lambdaComparer == null)
throw new ArgumentNullException("lambdaComparer");
if (lambdaHash == null)
throw new ArgumentNullException("lambdaHash");
_lambdaComparer = lambdaComparer;
_lambdaHash = lambdaHash;
}
public bool Equals(T x, T y)
{
return _lambdaComparer(x, y);
}
public int GetHashCode(T obj)
{
return _lambdaHash(obj);
}
}교묘 하 게 범 형 의뢰 방식 을 채택 하여 IEquality Comparer
var newList3 = list.Distinct(new LambdaComparer<User>((a, b) => a.Id == b.Id && a.Name == b.Name, obj => obj.ToString().GetHashCode())).ToList();익숙 한 표기 법 이 아 닙 니까?비교 하고 싶 은 대로 비교 하고 편리 하 며 빠 릅 니 다.그렇게 많은 종 류 를 정의 하여 인 터 페 이 스 를 실현 하고 목적 을 달성 할 필요 가 없습니다.Linq 에는 IEquality Comparer참고 자료
1、 https://www.jb51.net/article/162602.htm
2、https://ask.helplib.com/c-Sharp/post_1277383
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
알고리즘 의 미소스 코드 발표 (9)내용 소개: 비밀 알고리즘 세 계 를 탐색 하고 데이터 구조의 길 을 모색 한다.전형 적 인 문 제 를 모 아 프로 그래 밍 기법 의 취 미 를 즐 깁 니 다.구직 핫 이 슈 를 지적 하여 개업 계 의 유명 기업 의...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.