>

List 에서 얻고 싶은 C # 응용 프로그램이 있습니다.  프로젝트객체, 다른 객체를 포함하는 다른 목록

나는 이것을 시도했다

List<Project> model = notre_admin.Get_List_Project_By_Expert(u.Id_user);
 if (model != null) model = model.Distinct().ToList();

리스트 모델에는 여전히 4 개의 동일한 객체가 포함되어 있습니다 .

이 이유는 무엇입니까? 어떻게 고칠 수 있나요?

Project
  • 답변 # 1

    여기서 "동일"을 정의해야합니다. "동일한 내용을 가짐"을 의미한다고 생각하지만 클래스에 대한 기본 정의는아닙니다. 기본 정의는 "동일한 인스턴스입니다"

    "동일"이 "같은 내용을 가짐"을 의미하는 경우 두 가지 옵션이 있습니다 :

    맞춤 비교기 작성 ( IEqualityComparer<Project> )를 Distinct 에 매개 변수로 제공하십시오.

    Equals 재정의  그리고 GetHashCode   Project 에서

    DistinctBy 와 같은 사용자 정의 방법도 있습니다  장소가 많기 때문에 단일 속성 ( Id )으로 정체성을 결정할 수있는 경우 유용합니다 )-BCL에는 없습니다. 그러나 예를 들면 :

    if (model != null) model = model.DistinctBy(x => x.Id).ToList();
    
    

    예를 들면 다음과 같습니다.

    public static IEnumerable<TItem>
        DistinctBy<TItem, TValue>(this IEnumerable<TItem> items,
        Func<TItem, TValue> selector)
    {
        var uniques = new HashSet<TValue>();
        foreach(var item in items)
        {
            if(uniques.Add(selector(item))) yield return item;
        }
    }
    
    

  • 답변 # 2

    var newList = 
    (
    from x in model
    select new {Id_user= x.Id_user}
    ).Distinct();
    
    

    또는 이렇게 쓸 수 있습니다

    var list1 = model.DistinctBy(x=> x.Id_user);
    
    

  • 답변 # 3

    동일하게 어떻게 정의합니까? Equals 를 재정의해야합니다  와이즈 비즈  이 정의로 ( Project 를 재정의하는 경우)  또한 Equals 를 재정의 ). 예를 들면 다음과 같습니다.

    GetHashCode
    
    

    그렇지 않으면 참조 평등을 확인하는 것입니다.

  • 답변 # 4

    개체의 참조가 동일하지 않습니다. 속성뿐만 아니라 전체 객체 자체에서이를 수행하려면 IEqualityComparer 또는 IEquatable를 구현해야합니다.

  • 답변 # 5

    이 예제를 확인하십시오. Comparator를 사용해야합니다. 또는 public class Project { public int ProjectID { get; set; } public override bool Equals(object obj) { var p2 = obj as Project; if (p2 == null) return false; return this.ProjectID == m2.ProjectID; } public override int GetHashCode() { return ProjectID; } } 를 재정의

    Equals()
    
    

    class Program { static void Main( string[] args ) { List<Item> items = new List<Item>(); items.Add( new Item( "A" ) ); items.Add( new Item( "A" ) ); items.Add( new Item( "B" ) ); items.Add( new Item( "C" ) ); items = items.Distinct().ToList(); } } public class Item { string Name { get; set; } public Item( string name ) { Name = name; } public override bool Equals( object obj ) { return Name.Equals((obj as Item).Name); } public override int GetHashCode() { return Name.GetHashCode(); } }

  • 이전 windows - 현재 % x이 (가) 예기치 않았습니다 배치 스크립트
  • 다음 coding style - $this-> input-> post ()에 액세스하는 Codeigniter 모범 사례