过滤对象列表

时间:2014-06-30 14:33:37

标签: c# .net visual-studio-2010 c#-4.0

大家好,

我在ArrayList PList中有一个对象列表。该对象看起来像这样

      Product 
      {
        int ProductId,
        string ProductDescription,
        int StoreId 
        int supplierid
      }

我想将非重复的产品组合添加到另一个产品中   数组

Product[] Parray.

示例:

ArrayList Plist有:

productid , productdescription, storeid, supplierid

1, "AB", 11 , 123
2, "CD", 24 ,454
1, "AB", 11 ,431

我希望Product [] Parray有

productid , productdescription, storeid, supplierid
1, "AB", 11 ,123
2, "CD", 24 , 454

我知道我可以使用哈希表作为键值对,但在这种情况下我有3个键ProductId,description& STOREID

以下是我的代码:

  private Types.Product[] LoadProducts()
        {
            ArrayList PList = new ArrayList();

           // Business Logic , extracting values from xml using xpath

                //Loop though each xml node
                for (int j = 0; j < xmlprodlist.Count; j++)
                {
                     //Business logic
                     PList.Add(call another function here);

                  }
                //What code here ??
                Types.Product[] PArray = (Types.Product[])PArrayList.ToArray(typeof(Types.Product));   
            return PArray;
        }

任何人都可以告诉我上面需要添加哪些代码这里有什么代码

4 个答案:

答案 0 :(得分:5)

您可以使用简单的GroupBy对数据进行分组,然后选择每个组的第一项:

Product[] Parray = PList.OfType<Product>()
                        .GroupBy(p => new {p.ProductId, p.ProductDescription, p.StoreId})
                        .Select(p => p.First())
                        .ToArray();

请注意,您没有理由再使用ArrayList(甚至标记了您的问题C#4.0),更好地使用通用List<T>类,这将使您的代码更加类型安全等等可以理解的。

另一种方法是提供IEqualityComparer,将有问题的三个属性与Distinct方法进行比较:

Product[] Parray = PList.OfType<Product>()
                        .Distinct(theIEqualityComparer)
                        .ToArray();

答案 1 :(得分:0)

我可能不明白......为什么不是hastable int-&gt;产品(productId-&gt;产品)

类似的东西(对不起,我这里没有c#编译器,这只是一个草稿)

proDictionary<int, Product> table = new Dictionary<int, Product>();

foreach (var x : inproducts)
     // if (!table.Keys.Contains(x)) // if you want to keep the first
    table.Add(x.ProductId, x);

return table.Values.ToArray();

答案 2 :(得分:0)

根据我的理解,你有一个产品清单,你想要一个基于ID的干扰清单。 首先在Product类中重写Equals和GetHashCode,然后使用LINQ获取distict项:

public class Product
{
    public int ProductId;
    public string ProductDescription;
    public int StoreId;
    public int supplierid;


    public override bool Equals(object obj)
    {
        if (obj == null || GetType() != obj.GetType())
            return false;

        return ProductId == ((Product)obj).ProductId;
    }


    public override int GetHashCode()
    {
        return ProductId.GetHashCode();
    }
}

并像这样使用

List<Product> products = new List<Product>();
products.Add(new Product() { ProductId = 1, ProductDescription = "Product 1" });
products.Add(new Product() { ProductId = 2, ProductDescription = "Product 2" });
products.Add(new Product() { ProductId = 3, ProductDescription = "Product 3" });
products.Add(new Product() { ProductId = 1, ProductDescription = "Product 1 again" });

var distictItems = products.Distinct().ToList();
Console.WriteLine(distictItems.Count()); //This prints 3

答案 3 :(得分:0)

执行此操作的一种方法是编写IEqualityComparer的实现。类似的东西:

public class ProductEqualityComparer : IEqualityComparer<Product>
{
    public bool Equals(Product x, Product y)
    {
        return x != null && y != null &&
               x.ProductId == y.ProductId &&
               x.ProductDescription == y.ProductDescription &&
               x.StoreId == y.StoreId;
    }

    public int GetHashCode(Product obj)
    {
        return String.Format("{0}-{1}-{2}",
            obj.ProductId,
            obj.ProductDescription,
            obj.StoreId)
            .GetHashCode();
    }
}

然后你可以这样做:

var comparer = new ProductEqualityComparer();
var array = (Types.Product[])PList.ToArray(typeof(Types.Product));
var distinct = array.Distinct(comparer);