C\#Distinct 를 실현 하여 대상 을 조건 에 따라 무 게 를 줍 니 다.

평소에 우 리 는 c\#중의 Distinct 를 대부분 배열 의 무 게 를 제거 하 는 데 사용 합 니 다.일반 배열 을 바탕 으로 하 는 데이터 형식,예 를 들 어 int,string.대상 의 무 게 를 제거 하 는 데 도 사용 할 수 있 습 니 다.우 리 는 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 를 실현 하여 대상 을 조건 에 따라 중시 하 는 것 이 바로 편집장 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저희 도 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기