3

特定の場所とその製品の許容される配送方法を持つ製品オブジェクトがあります。私がやろうとしているのは、製品を場所別および許容される発送方法別にグループ化することです。

たとえば、次の例のデータは、1 つは IDLocation = 1、ShipMethods は 1、2、カウントは 2 で、もう 1 つは IDLocation = 1、ShipMethods が 1、2、カウントが 3 の 2 つのグループを生成します。

public class CartProduct
    {
        public int IDLocation { get; set; }
        public List<int> ShipMethods { get; set; }

        public List<CartProduct> GetExampleData()
        {
            return new List<CartProduct>() { new CartProduct() { IDLocation = 1, ShipMethods = new List<int>(){ 1, 2 } },
                new CartProduct() { IDLocation = 1, ShipMethods = new List<int>(){ 1, 2 } },
                new CartProduct() { IDLocation = 1, ShipMethods = new List<int>(){ 3, 4 } },
                new CartProduct() { IDLocation = 1, ShipMethods = new List<int>(){ 3, 4 } },
                new CartProduct() { IDLocation = 1, ShipMethods = new List<int>(){ 3, 4 } }
            };
        }
    }

最初に IDLocation のグループ化を確認したいと思います。次に、発送方法が同じ場合は、それらも一緒にグループ化します。

group by のいくつかのバージョンを試してみましたが、運が悪いものを多く選択しました。

List<CartProduct> CPList = new CartProduct().GetExampleData();
var GroupItems  = CPList.GroupBy(x => x.IDLocation) // then by ShipMethods??
4

2 に答える 2

1

inのcomparer引数をGroupBy使用すると、オブジェクトのグループ化のために同等性を定義できます。true比較子は、2 つの類似オブジェクトを比較し、それらが等しい場合に返す別個のクラスです。を実装する必要があるクラスは、次のIComparer<CartItem>ように実装できます。

class CartGroupComparer : IEqualityComparer<CartProduct>
{
    public bool Equals(CartProduct x, CartProduct y)
    {
        return x.IDLocation == y.IDLocation
             && x.ShipMethods.OrderBy(x=>x)
                   .SequenceEqual(y.ShipMethods.OrderBy(x=>x));
    }

    public int GetHashCode(CartProduct obj)
    {
        return obj.IDLocation.GetHashCode() 
                ^ obj.ShipMethods.Sum().GetHashCode();
    }
}

ShipMethods(注: 簡単にするために、これはが null にならないことを前提としています。)

このEqualsメソッドは、2 つの項目が等しいかどうかをテストします。等しい場合、それらは同じグループに追加されます。このGetHashCodeメソッドは、等しいアイテムに対して等しい値を返す必要があり、単純な実装が上にあります。

この比較演算子をGroupBy句で直接使用できます。

new CartProduct().GetExampleData()
         .GroupBy(a => a, new CartGroupComparer());
于 2013-05-15T23:28:11.477 に答える