C\#Distinct 를 실현 하여 대상 을 조건 에 따라 무 게 를 줍 니 다.
9176 단어 C#Distinct대상무 거 운 것 을 제거 하 다
과부하 가 있 습 니 다.첫 번 째 매개 변 수 는 모두 this 를 추 가 했 습 니 다.확장 방법 입 니 다.확장 방법 에 대해 바 이 두 에서 알 아 보 세 요.
다음은 Distinct 의 대상 을 연구 하고 우리 가 지금 People 류 가 있다 고 가정 합 시다.
public class People
{
public int ID { get; set; }
/// <summary>
///
/// </summary>
public string Name { get; set; }
/// <summary>
///
/// </summary>
public string Province { get; set; }
/// <summary>
///
/// </summary>
public int Age { get; set; }
public override string ToString()
{
return string.Format("ID:{0} Name:{1} Province:{2} Age:{3}", ID, Name, Province, Age);
}
}
우 리 는 ListPeole 대상 집합 을 성명 합 니 다.
People p = new People() { ID = 100, Name = "liu", Province = " ", Age = 100 };
People p1 = p;
People p2 = p1;
IEnumerable<People> ListPeople = new List<People>()
{
p,
p1,
p2,
new People(){ID=0,Name="li",Province=" ",Age=20},
new People(){ID=0,Name="li",Province=" ",Age=20},
new People(){ID=1,Name="li",Province=" ",Age=20},
new People(){ID=1,Name="li",Province=" ",Age=20},
new People(){ID=2,Name="li",Province=" ",Age=20},
new People(){ID=3,Name="li",Province=" ",Age=21},
new People(){ID=4,Name="li",Province=" ",Age=22},
};
ListPeople 에 대해 Distinct 방법 을 사용 합 니 다.매개 변 수 를 가지 고 있 지 않 습 니 다.실행 결 과 는 다음 과 같 습 니 다.이 를 통 해 알 수 있 듯 이 Distinct 방법 에 매개 변수 가 없 으 면 대상 집합 에서 p,p1,p2 를 무 게 를 제거 하고 대상 의 구성원 값 이 같은 대상 에 대해 무 게 를 제거 하지 않 았 다.이 는 Distinct 방법 에 매개 변 수 를 추가 하지 않 으 면 무 게 를 제거 하 는 규칙 은 대상 집합 에서 대상 의 인용 이 같 는 지 비교 하 는 것 이다.같 으 면 무 게 를 제거 하고 그렇지 않 으 면 무 게 를 제거 하지 않 는 다.
지금 우 리 는 ID 가 같은 People 에 대해 같은 사람 이 라 고 할 수 있 습 니 다.집합 에서 중복 되 지 않 는 사람(ID 가 같은 사람 에 게 하 나 를 마음대로 출력 하면 됩 니 다)을 출력 해 야 합 니 다.이때 우 리 는 Distinct 의 두 번 째 방법 을 사 용 했 습 니 다.방법 은 IEquality Comparer 유형 으로 일반적인 인 터 페 이 스 를 계승 하고 우 리 는 다음 과 같은 코드 를 추가 합 니 다.
public class PeopleCompareByID : IEqualityComparer<People>
{
public bool Equals(People x, People y)
{
if (x == null || y == null)
return false;
if (x.ID == y.ID)
return true;
else
return false;
}
public int GetHashCode(People obj)
{
if (obj == null)
return 0;
else
return obj.ID.GetHashCode();
}
}
IEquality Comparer 인 터 페 이 스 를 계승 하려 면 Equals 와 GetHashCode 방법 을 실현 해 야 합 니 다.우리 가 비교 할 때 People CompareByID 의 실 체 를 전달 하면 됩 니 다.
ListPeople.Distinct(new PeopleCompareByID()).ToList().ForEach(x => Console.WriteLine(x));
실행 결 과 는 다음 과 같 습 니 다.
우리 가 ID 로 무 게 를 빼 는 효 과 를 거 두 었 다.
현재 수요 가 바 뀌 었 습 니 다.ID 와 성 이 같은 사람 이 라 고 할 수 있 습 니 다.사람의 정 보 를 출력 해 야 합 니 다.(똑 같은 것 은 하 나 를 마음대로 출력 하면 됩 니 다)이때 우 리 는 ID=0 과 Province='호북성'의 존재 가 중복 되 는 것 을 보 았 습 니 다.이 를 다시 한 가지 유형 으로 할 까요?아니면 IEquality Comparer 를 계승 할 까요?
public class PeopleCompareByIDAndProvince : IEqualityComparer<People>
{
public bool Equals(People x, People y)
{
if (x == null || y == null)
return false;
if (x.ID == y.ID&&x.Province==y.Province)
return true;
else
return false;
}
public int GetHashCode(People obj)
{
if (obj == null)
return 0;
else
return obj.ID.GetHashCode()^obj.Province.GetHashCode();
}
}
마찬가지 로 Distinct 방법 을 사용 할 때 People CompareByIDAndProvince 의 인 스 턴 스 를 전달 합 니 다.ListPeople.Distinct(new PeopleCompareByIDAndProvince()).ToList().ForEach(x => Console.WriteLine(x));
실행 후의 결 과 는 다음 과 같다.
추가:1.클래스 의 특정한 속성 은 list 배열 입 니 다.이 list 의 인용 이 같 는 지 여부 에 따라 같은 대상 인지 판단 합 니 다.
우 리 는 위의 코드 를 다음 과 같이 수정 합 니 다.
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int>() { 1, 2, 11, 222, 3, 4 };
List<int> list1 = new List<int>() { 1, 2, 11, 222, 3, 4 };
People p1 = new People() { Name = "Tony1", ID = 1, Age = 18, Members = list };
People p2 = new People() { Name = "Tony2", ID = 2, Age = 19, Members = list };
People p3 = new People() { Name = "Tony3", ID = 3, Age = 20, Members = list1 };
People p4 = new People() { Name = "Tony4", ID = 4, Age = 21, Members = new List<int>() };
List<People> personList = new List<People>() { p1, p2,p2,p3,p4 };
personList.Distinct(new PeopleComparedByList()).ToList().ForEach(x => Console.WriteLine(x));
Console.Read();
}
}
public class People
{
public int ID { get; set; }
/// <summary>
///
/// </summary>
public string Name { get; set; }
/// <summary>
///
/// </summary>
public string Province { get; set; }
/// <summary>
///
/// </summary>
public int Age { get; set; }
private List<int> members = new List<int>();
public List<int> Members
{
get { return members; }
set { members = value; }
}
public override string ToString()
{
return string.Format("ID:{0} Name:{1} Province:{2} Age:{3},Members:{4}", ID, Name, Province, Age,string.Join("-",this.Members.ToList()));
}
}
public class PeopleComparedByList : IEqualityComparer<People>
{
public bool Equals(People x, People y)
{
if (x.Members == y.Members)
return true;
else
return false;
}
public int GetHashCode(People obj)
{
return obj.Members.GetHashCode();
}
}
실행 결 과 는 다음 과 같 습 니 다.결 과 를 보면 토 니 1,토 니 2 의 Members 속성 은 같은 인용 list 이기 때문에 반복 할 때 토 니 2 를 지 웠 습 니 다.
우리 가 원 하 는 효 과 를 거 두 었 다.
추가:2.클래스 의 특정한 속성 은 list 배열 입 니 다.이 list 의 각 요소 의 값 이 같 는 지 에 따라 같은 대상 인지 판단 합 니 다.
우 리 는 비교 기 를 새로 추가 합 니 다.
public class PeopleComparedByListValue : IEqualityComparer<People>
{
public bool Equals(People x, People y)
{
if (x.Members == null && y.Members == null)
return true;
if (x.Members == null || y.Members == null)
return false;
if (x.Members.Count != y.Members.Count)
return false;
//
for (int i = 0; i < x.Members.Count; i++)
{
if (x.Members[i] != y.Members[i])
return false;
}
return true;
}
public int GetHashCode(People obj)
{
var hashCode = 1;
if (obj.Members == null)
return 0;
if (obj.Members.Count == 0)
return 1;
obj.Members.ForEach(x => hashCode ^= x);
return hashCode;
}
}
이 비교 기 사용 하기:
static void Main(string[] args)
{
List<int> list = new List<int>() { 1, 2, 11, 222, 3, 4 };
List<int> list1 = new List<int>() { 1, 2, 11, 222, 3, 4 };
People p1 = new People() { Name = "Tony1", ID = 1, Age = 18, Members = list };
People p2 = new People() { Name = "Tony2", ID = 2, Age = 19, Members = list };
People p3 = new People() { Name = "Tony3", ID = 3, Age = 20, Members = list1 };
People p4 = new People() { Name = "Tony4", ID = 4, Age = 21, Members = new List<int>() };
List<People> personList = new List<People>() { p1, p2,p2,p3,p4 };
personList.Distinct(new PeopleComparedByListValue()).ToList().ForEach(x => Console.WriteLine(x));
Console.Read();
}
실행 결과:이 를 통 해 알 수 있 듯 이 배열 값 은 1,2,11,222,3,4 의 값 이 하나 밖 에 남지 않 아 값 에 따라 똑 같이 반복 되 는 효 과 를 거 두 었 다.
앞으로 세 명 이나 네 명,심지어 더 많은 대상 멤버 로 대상 의 중복 제거 여 부 를 결정 할 때 이런 방법 을 사용 할 수 있다.
이상 은 개인의 졸견 입 니 다.이 C\#Distinct 를 실현 하여 대상 을 조건 에 따라 중시 하 는 것 이 바로 편집장 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.