我有ComboUniqueId
这个基础我想要ComboAmount,我的问题是如何在ComboAmount
基础上获得明确的ComboUniqueId
请帮助我,我的代码如下:
ComboUniqueId是字符串
decimal FinalTotal = 0;
var ListUnique = this.OrderDetailArr.Select(x => new {
ComboAmount = x.ComboAmount,
ComboId = x.ComboId,
ComboUniqueId = x.ComboUniqueId,
ItemAddOnsArr = x.ItemAddOnsArr,
TotalPrice = x.TotalPrice
}).Distinct(x=> x.ComboUniqueId);
for (int i = 0; i < ListUnique.Length; i++)
{
FinalTotal += ListUnique[i].TotalPrice;
if(ListUnique[i].ComboId != null)
{
FinalTotal = ListUnique[i].ComboAmount;
}
if (ListUnique[i].ItemAddOnsArr != null)
{
for (int g = 0; g < this.OrderDetailArr[i].ItemAddOnsArr.Length; g++)
{
FinalTotal += this.OrderDetailArr[i].ItemAddOnsArr[g].AddOnTotalPrice;
}
}
}
答案 0 :(得分:0)
听起来像this.OrderDetailArr
有重复项,你想要删除它们。
您可以使用类似于以下内容的代码执行此操作,而不是创建匿名对象:
var ListUnique = this.OrderDetailArr
// Group on the ComboUniqueId, you'll get 1 key with multiple values for duplicates
.GroupBy(m => m.ComboUniqueId)
// By retrieving the First(), you're limiting your result set to 1 per the group
.Select(m => m.First());
您的代码的其余部分应该正常运行。
这里没有必要创建一个新的匿名类型(.Select(.. => new {..})
)因为你只是从源中提取属性,所以你也可以保留它。
如果你开始使用Distinct
,那么你的对象类型需要EqualityComparer<T>
,只需要查看对象的ComboUniqueId
属性来比较相等,你然后可以按照原始代码在Distinct
方法中使用它。请注意,它再次不适用于您的匿名类型。