我有这两个类:
public class Order
{
public int ID { get; set; }
public int Output { get; set; }
public int Wharf { get; set; }
public int PartOf { get; set; }
public int[] Product { get; set; }
public int[] Quantity { get; set; }
public int[] Storage { get; set; }
public override bool Equals(Order obj)
{
// If parameter is null return false.
if (obj == null)
{
return false;
}
// Return true if the fields match:
return (ID == obj.ID);
}
}
public class RawOrderData
{
public int ID { get; set; }
public int Output { get; set; }
public int Wharf { get; set; }
public int PartOfID { get; set; }
public int ProductID { get; set; }
public int Quantity { get; set; }
}
系统中的每个订单都采用类Order
的形式,当订单中有多个产品时,将使用该数组。
{J}字符串创建RawOrderData
,其中订单中的每个产品都有自己的对象。我想创建一个List<Order>
,其中每个订单在列表中都有自己的对象,因此当订单包含多个产品时,没有多个订单具有相同的订单ID。
// raw data is here the JSON string
rawdatalist = serializer.Deserialize<List<RawOrderData>> (rawdata);
// Convert raw objects to List<Order>, list of orders
List<Order> orders = new List<Order> ();
orders = ConvertRawOrderToList (rawdatalist);
private List<Order> ConvertRawOrderToList(List<RawOrderData> datalist)
{
List<Order> orders = new List<Order> ();
foreach (RawOrderData dataobj in datalist)
{
// Check if order exists in list
if (orders.Contains(new Order () {ID = dataobj.ID}))
{
// Order exists, add more products
// CODE HERE?
} else {
// order not existing, add new order to list
short storage = GetStorageArea(dataobj.ProductID);
orders.Add (new Order () {ID = dataobj.ID, Output = dataobj.Output, Wharf = dataobj.Wharf, PartOf = dataobj.PartOfID, Product = dataobj.ProductID, Quantity = dataobj.Quantity});
}
}
return orders;
}
我认为使用ConvertRawOrderToList
方法是否正确?问题是我不知道在// CODE HERE?
写什么。当列表对象中有数组时我很困惑。
我也想知道如何访问List<Order>
订单中的所有值。
Storage[]
的信息是从另一种产品ID作为输入的方法创建的。
答案 0 :(得分:1)
听起来你有一个&#34;扁平的&#34;要分组到Order
的对象的集合。如果是这样的话,基本的Linq投影将是最简单的:
var orders = datalist.GroupBy(o => o.ID)
.Select(g => new Order {
ID = g.Key,
Output = g.First().Output,
Wharf = g.First().Wharf,
PartOf = g.First().PartOf,
Product = g.Select(o => o.Product).ToArray(),
Quantity = g.Select(o => o.Product).ToArray(),
})
.ToList();
然后,您不必担心覆盖Equals
(至少不是为此目的)。
我还会在哪里添加添加存储的方法?
由于您的GetStorageArea
函数需要一个ProductID,因此您需要将产品ID传递给该函数:
var orders = datalist.GroupBy(o => o.ID)
.Select(g => new Order {
ID = g.Key,
Output = g.First().Output,
Wharf = g.First().Wharf,
PartOf = g.First().PartOf,
Product = g.Select(o => o.Product).ToArray(),
Quantity = g.Select(o => o.Product).ToArray(),
Storage = g.Select(o => GetStorageArea(o.Product)).ToArray()
})
.ToList();