如何结合并总结基于唯一ID的两个列表的结果
问题描述:
我有一个方法来检索两个列表。 和我显示基于联盟的列表。如何结合并总结基于唯一ID的两个列表的结果
,但我想总结基础上,唯一的ID是FC_Id
public List<ContractFundingCategory> CalculateContractFundingCategoryAmountbyPurchaseOrder(int poId, string serviceType)
{
List<ContractFundingCategory> lstContractFundingCategory = new List<ContractFundingCategory>();
var lstContractFundingCategoryEbs =
(
from payment in context.PaymentDetails
join reimEbs in context.Reimbursement_EBSUtilization on payment.REU_Id equals reimEbs.Id into ebs_join
from reimEbs in ebs_join.DefaultIfEmpty()
join purc in context.PurchaseOrders on payment.PO_Id equals purc.Id
join serviceDetail in context.fServiceDetails on reimEbs.SD_Id equals serviceDetail.Id
join fundingCategory in context.fFundingCategories on serviceDetail.FC_Id equals fundingCategory.Id into fundingCategory_Join
from fundingCategory in fundingCategory_Join.DefaultIfEmpty()
where payment.PO_Id == poId && (serviceDetail.ServiceType == serviceType)
group new { fundingCategory, payment, serviceDetail } by new
{
fundingCategory.Id,
serviceDetail.ServiceType,
} into grp
select new
{
FC_Id = grp.Key.Id,
serviceType = grp.Key.ServiceType,
BudgetAmount = grp.Sum(p => p.payment.PaymentAmount),
}
)
.AsEnumerable().Select(x => new ContractFundingCategory
{
FC_Id = x.FC_Id,
BudgetAmount = x.BudgetAmount,
ServiceType = x.serviceType.ToString()
}).ToList();
var lstContractFundingCategoryCds =
(
from payment in context.PaymentDetails
join reimCds in context.Reimbursement_CDSUtilization on payment.RCU_Id equals reimCds.Id into cds_join
from reimCds in cds_join.DefaultIfEmpty()
join cdsutil in context.CDSUtilizations on reimCds.CDSU_Id equals cdsutil.Id
join purc in context.PurchaseOrders on payment.PO_Id equals purc.Id
join serviceDetail in context.fServiceDetails on cdsutil.ServiceDetail_Id equals serviceDetail.Id
join fundingCategory in context.fFundingCategories on serviceDetail.FC_Id equals fundingCategory.Id into fundingCategory_Join
from fundingCategory in fundingCategory_Join.DefaultIfEmpty()
where payment.PO_Id == poId && (serviceDetail.ServiceType == serviceType)
group new { fundingCategory, payment, serviceDetail } by new
{
fundingCategory.Id,
serviceDetail.ServiceType,
} into grp
select new
{
FC_Id = grp.Key.Id,
serviceType = grp.Key.ServiceType,
BudgetAmount = grp.Sum(p => p.payment.PaymentAmount),
}
)
.AsEnumerable().Select(x => new ContractFundingCategory
{
FC_Id = x.FC_Id,
BudgetAmount = x.BudgetAmount,
ServiceType = x.serviceType.ToString()
}).ToList();
//lstContractFundingCategory.AddRange(lstContractFundingCategoryEbs);
//lstContractFundingCategory.AddRange(lstContractFundingCategoryCds);
//List<ContractFundingCategory> a = new List<ContractFundingCategory>();
lstContractFundingCategory = lstContractFundingCategoryEbs
.Union(lstContractFundingCategoryCds)
.ToList();
return lstContractFundingCategory;
}
任何一个可以帮助我走出编写循环语句
答
lstContractFundingCategory.Aggregate(new Dictionary<int,int>(), (acc,elem) => { acc.ContainsKey(elem.FC_Id) ? acc[elem.FC_Id] += elem.BudgetAmount : acc.Add(elem.FC_Id, elem.BudgetAmount); return acc; });
总金额为折叠类似物,其迭代你的值并将它们应用到累加器。在这种情况下,我们提供了一个新的字典作为累加器。匿名函数检查字典是否有你的密钥;如果确实如此,则它将预算值添加到当前值,并且如果它不添加具有初始预算值的密钥。它将返回一个字典,其中的键是唯一的FC_Id,它们的值是这些预算的总和。
作为一般性评论:请不要将您的代码复制并粘贴到SO中。花点时间把它缩小到足够小,这样人们不必为了看看你做了什么而水平滚动太多。 – phil13131