.Contains () 사용자 정의 클래스 객체 목록


95

.Contains()사용자 지정 개체 목록 에서 함수 를 사용하려고 합니다.

다음은 목록입니다.

List<CartProduct> CartProducts = new List<CartProduct>();

그리고 CartProduct:

public class CartProduct
{
    public Int32 ID;
    public String Name;
    public Int32 Number;
    public Decimal CurrentPrice;
    /// <summary>
    /// 
    /// </summary>
    /// <param name="ID">The ID of the product</param>
    /// <param name="Name">The name of the product</param>
    /// <param name="Number">The total number of that product</param>
    /// <param name="CurrentPrice">The currentprice for the product (1 piece)</param>
    public CartProduct(Int32 ID, String Name, Int32 Number, Decimal CurrentPrice)
    {
        this.ID = ID;
        this.Name = Name;
        this.Number = Number;
        this.CurrentPrice = CurrentPrice;
    }
    public String ToString()
    {
        return Name;
    }
}

그래서 나는 목록에서 비슷한 카트 제품을 찾으려고 노력합니다.

if (CartProducts.Contains(p))

그러나 유사한 카트 제품을 무시하고 ID가 무엇인지 확인하지 못하는 것 같습니다. 아니면 전부?

미리 감사드립니다! :)

답변:


119

구현 IEquatable하거나 재정의 해야 Equals()하며GetHashCode()

예를 들면 :

public class CartProduct : IEquatable<CartProduct>
{
    public Int32 ID;
    public String Name;
    public Int32 Number;
    public Decimal CurrentPrice;

    public CartProduct(Int32 ID, String Name, Int32 Number, Decimal CurrentPrice)
    {
        this.ID = ID;
        this.Name = Name;
        this.Number = Number;
        this.CurrentPrice = CurrentPrice;
    }

    public String ToString()
    {
        return Name;
    }

    public bool Equals( CartProduct other )
    {
        // Would still want to check for null etc. first.
        return this.ID == other.ID && 
               this.Name == other.Name && 
               this.Number == other.Number && 
               this.CurrentPrice == other.CurrentPrice;
    }
}

4
하지만 어디에 GetHashCode()있습니까?
zionpi

1
GetHashCode ()를 구현할 필요가 없습니다. 그것 없이도 작동합니다.
user890332

141

.NET 3.5 이상을 사용하는 경우 LINQ 확장 메서드를 사용하여 확장 메서드로 "포함"검사를 수행 할 수 있습니다 Any.

if(CartProducts.Any(prod => prod.ID == p.ID))

CartProductsID와 일치하는 ID가 있는 제품이 있는지 확인합니다 p. =>검사를 수행하기 위해 뒤에 부울 표현식을 넣을 수 있습니다 .

이는 또한 LINQ-to-SQL 쿼리 및 메모리 내 쿼리에 대해 작업 할 수있는 이점이 있습니다 Contains.


12

특정 개체가 목록에 포함되어 있는지 확인합니다.

목록에서 찾기 방법을 사용하는 것이 더 나을 수 있습니다.

여기에 예가 있습니다.

List<CartProduct> lst = new List<CartProduct>();

CartProduct objBeer;
objBeer = lst.Find(x => (x.Name == "Beer"));

도움이되는 희망

당신은 또한 LinQ를 봐야합니다-아마도 이것에 대해서는 과잉이지만 그럼에도 불구하고 유용한 도구입니다 ...


1
Linq는 어떻게 과잉 일 수 있습니까?
Mel Gerats 2010

@MEL-왜 이렇게 간단한 쿼리와 유형 추론에서 혼동됩니까? 즉 ... 그것은 lamdas에 익숙하지 않은 사람이 더 많은 읽을 수 있습니다,하지만했다
마틴 밀란

+1 다른 곳에서 변경해도 영향을받지 않는 옵션을 보여주는 분명한 예 (즉, Equals()방법이 어떤 이유로 든 변경된 경우 )
Rowland Shaw

4

기본적으로 참조 유형은 참조가 동일합니다 (즉, 두 인스턴스가 동일한 객체 인 경우에만 동일 함).

자신의 평등을 구현 하려면 재정의 Object.Equals(및 Object.GetHashCode일치)해야합니다. (그러면 같음 ==연산자 를 구현하는 것이 좋습니다 .)


1
코드의 다른 곳에서 결과를 초래할 수있는 Object.Equals를 재정의하는 이유는 무엇입니까? ... 나에게, 그에 따라 검색 코드를 수정하는 것이 더 의미가 있습니다, 및 개체 존재 아닌 기본 클래스에 따라 검색
마틴 밀라노

이것, .Find () 또는 Object.Equals / GetHashCode 재정의에 대한 몇 가지 예가 있습니까?
Jan Johansen

@Martin IT는 두 CartProduct개체 의 비교가 서로 다른 장소에서 다르게 작동하기 를 원한다면 매우 망가질 것 입니다.
Rowland Shaw

1
@Rowland-하지만 비교가 작동하는 방식을 변경해야한다는 것은 아닙니다. 특정 개체를 원하면 Contains ()를 사용합니다. 그가 지정된 기준과 일치하는 객체를 원하면 적합한 술어 (람다 표현식)와 함께 Find ()를 사용하십시오. 실제로 비교 코드를 전혀 건드리지 않는다고 주장합니다. 수행하려는 작업 목록 ...
Martin Milan

1
@Martin 나타납니다 귀하의 의견을 "무시 Contains()" 라인을 따라 뭔가 잘못 해석했습니다 . Find()OP가 동일한 엔터티의 두 인스턴스에 대한 참조가 다른 것을 발견하지 않았기 때문에 적절한 equals 메서드를 사용하는 것이 다른 경우에 더 유용 할 수 있다고 제안하지만 문제를 해결할 수 있다는 데 동의합니다 .
Rowland Shaw

1

다음과 같이 목록에서 개체를 만들어야합니다.

List<CartProduct> lst = new List<CartProduct>();

CartProduct obj = lst.Find(x => (x.Name == "product name"));

해당 개체는 속성으로 검색 한 값을 가져옵니다. x.name

그런 다음 포함 또는 제거와 같은 List 메서드를 사용할 수 있습니다.

if (lst.Contains(obj))
{
   lst.Remove(obj);
}

0

구현 override Equals()GetHashCode()

public class CartProduct
{
    public Int32 ID;
    ...

    public CartProduct(Int32 ID, ...)
    {
        this.ID = ID;
        ...
    }

    public override int GetHashCode()
    {
        return ID;
    }

    public override bool Equals(Object obj)
        {
            if (obj == null || !(obj is CartProduct))
                return false;
            else
                return GetHashCode() == ((CartProduct)obj).GetHashCode();
        }

}

익숙한:

if (CartProducts.Contains(p))

-1

이를 제어하려면 [IEquatable 인터페이스] [1]를 구현해야합니다.

[1] : http : //이 메서드는 T (목록의 값 유형)에 대한 개체의 IEquatable.Equals 메서드 구현에 정의 된 기본 같음 비교자를 사용하여 같음을 결정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.