2012-03-07 1 views
10

en 엔터티 프레임 워크 형식 목록을 받고 List에서 고유 값만 반환하려고합니다. 나는 다음과 같은 접근법을 사용하고 있지만 목록을 고유하게 만들지는 않습니다. 어떤 제안?C#에서 사용자 지정 형식의 고유 목록 만들기

파람 : ID, 플래그, FlagValue를 다음과 같이 플래그의 List<Flag> flags

List<Flag> distinctFlags = flags.Distinct().ToList(); 

값이다. 이 인스턴스에서 linq을 사용할 수 있습니까?

감사합니다. Flag 가정

+0

사용자의 입력 값은 당신은 출력으로 무엇을 기대 하는가? –

+0

dbcontext 내부 또는 외부입니까? 제발 더 많은 코드를 보여주십시오. 가능한 경우 변환 전후에 데이터 예제를 제공하십시오. –

+1

그룹을 만들어 승자를 선택하십시오. http://stackoverflow.com/questions/489258/linq-distinct-on-a-particular-property/491832#491832 –

답변

14

당신은 partialclass를 사용하고 EqualsGetHashCode을 무시할 수, 엔터티 모델 중 하나입니다. 또한 사용자가 고유 한 ID가 할당 된 classId 속성이 있다고 가정합니다.

//this namespace MUST match the namespace of your entity model. 
namespace Your.Entity.Model.Namespace 
{ 
    public partial class Flag 
    { 
     public override bool Equals(object obj) 
     { 
      var item = obj as Flag; 

      if (item == null) 
      { 
       return false; 
      } 

      return this.Id.Equals(item.Id); 
     } 

     public override int GetHashCode() 
     { 
      return this.Id.GetHashCode(); 
     } 
    } 
} 

사용은 참조 형식의 목록입니다 아마이

List<Flag> distinctFlags = allFlags.Distinct().ToList(); 
+1

또한 유형에 'IEquatable '을 구현해야합니다. – svick

+0

아마'=='와'! ='를 오버라이드 할 것입니다. –

+0

'Equals'와'GetHashCode' 만 구현하면됩니다. 해시 코드 값이 절대로 변경되지 않는다는 것을 절대적으로 확인하십시오. 값은 반드시 변환 가능해야합니다. – Enigmativity

1

flags처럼 보일 것이고, 예상대로 별개 작동하지 않습니다! Distinct()는 목록의 플래그 값이 아니라 해당 메모리 참조 (모두 다름)에서 작동하기 때문입니다.

등호를 비교하는 방법을 가르치는 비교 자 클래스를 작성해야합니다.

class FlagComparer : IEqualityComparer<flag> 
{ 
    // Products are equal if their names and product numbers are equal. 
    public bool Equals(flag x, flag y) 
    { 

     //Check whether the compared objects reference the same data. 
     if (Object.ReferenceEquals(x, y)) return true; 

     //Check whether any of the compared objects is null. 
     if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) 
      return false; 

     //Check whether the products' properties are equal. 
     return x.Code == y.Code && x.Name == y.Name; 
    } 
} 

을하고,이 명세서 전화 :

public class flag 
{ 
    public string Name { get; set; } 
    public string Code { get; set; } 
} 

는이 같은 비교 자 클래스를 생성해야합니다 알고, 뚜렷한 방법이 방법으로

List distinctFlags = flags.Distinct(new FlagComparer()).ToList(); 

이 플래그 클래스가 있다고 가정 정확히 일치하는 플래그를 istance 방법.

물론
class FlagComparer : IEqualityComparer<flag> 
    { 
     // Products are equal if their names and product numbers are equal. 
     public bool Equals(flag x, flag y) 
     { 

      //Check whether the compared objects reference the same data. 
      if (Object.ReferenceEquals(x, y)) return true; 

      //Check whether any of the compared objects is null. 
      if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) 
       return false; 

      //Check whether the products' properties are equal. 
      return x.HostID == y.HostID && x.RuleID == y.RuleID && x.Flag == y.Flag && x.FlagValue == y.FlagValue; 
     } 
    } 

이 모든 속성 값 형식이어야합니다 : 당신이 내 제안을 따르도록 wanto 경우

UPDATE 귀하의 의견을 바탕으로

, 당신은 다음과 같은 비교 자 기반을 작성해야 .

자신을 명확히하기 위해 여기를보세요 : 무엇

+1

이 방법이 효과적 일 수 있습니다. 그러나 'Equals()'를 무시하고 IEquatable 을 구현하는 것이 일반적인 방법입니다. 매번 비교자를 지정할 필요가 없기 때문입니다. – svick

관련 문제