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

.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가 무엇인지 확인하지 못하는 것 같습니다. 아니면 전부?

미리 감사드립니다! 🙂



답변

구현 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;
    }
}


답변

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

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

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

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


답변

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

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

여기에 예가 있습니다.

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

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

도움이되는 희망

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


답변

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

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


답변

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

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);
}


답변

구현 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))


답변

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

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