2014-06-30 51 views
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 

我想要產品[] Parray有

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

我知道,我可以用鍵值對的哈希表,但在這種情況下,我有3個按鍵產品編號,說明& 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; 
     } 

誰能告訴我,我需要的地方什麼代碼在這裏

+2

爲什麼你使用'ArrayList'而不是'名單'? – Habib

回答

0

我可能下沒有上面加什麼代碼站在...爲什麼不是hastable內部 - >產品(productId->產品)

像(抱歉,我沒有交流#編譯器在這裏,這只是一個草案)

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(); 
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>類,這將使您的c更多類型安全和更容易理解。

另一種方式是提供一個IEqualityComparer這三個屬性中的問題比作Distinct方法:

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

從我瞭解您所擁有的產品清單,並希望基於ID的DISTICT列表。 首先重寫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 
+0

如果您評論兩個「覆蓋」功能,則程序打印4 –

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