.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))
CartProducts
ID와 일치하는 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 메서드 구현에 정의 된 기본 같음 비교자를 사용하여 같음을 결정합니다.