J'ai le code suivant:comportement étrange Linq avec IList/IEnumerable
public IList<IProductViewModel> ChildProducts { get; set; }
public IList<IProductViewModel> GiftItems { get; set; }
public IList<IProductViewModel> PromoItems { get; set; }
public IList<IProductViewModel> NonGiftItems
{
get
{
return NonPromoItems.Except(GiftItems, new ProductViewModelComparer()).ToList();
}
}
public IList<IProductViewModel> NonPromoItems
{
get
{
return ChildProducts.Where(p => !p.IsPromotion).ToList();
}
}
ProductViewModelComparer:
public class ProductViewModelComparer : IEqualityComparer<IProductViewModel>
{
#region IEqualityComparer<IProductViewModel> Members
public bool Equals(IProductViewModel x, IProductViewModel y)
{
if (Object.ReferenceEquals(x, y))
return true;
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
return String.Equals(x.ProductId, y.ProductId);
}
public int GetHashCode(IProductViewModel obj)
{
return obj.ProductId.GetHashCode();
}
#endregion
}
Donc, fondamentalement, NonPromoItems
est (ChildProducts - PromoItems)
et NonGiftItems
est (NonPromoItems - GiftItems)
Toutefois, lorsque :
ChildProducts
= IEnumerable<IProductViewModel>[6]
PromoItems
= IEnumerable<IProductViewModel>[1]
où l'article correspond à 1 pièce ChildProducts
GiftItems
= IEnumerable<IProductViewModel>[0]
Mon résultat est
NonPromoItems
= IEnumerable<IProductViewModel>[5]
Ceci est correct NonGiftItems
= IEnumerable<IProductViewModel>[4]
Ceci est incorrect
D'une manière ou d'une autre Except(...)
supprime un élément lorsqu'il reçoit une liste vide à soustraire.
Vous avez des idées?
Peut-on voir le code comparateur? – Aaronaught
Il y a le code, ne devrait pas importer puisqu'il compare 'NonPromoItems' à' GiftItems' et 'GiftItems' est vide ... – Aren