大家好,
我在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;
}
任何人都可以告诉我上面需要添加哪些代码这里有什么代码
答案 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);