public void CalculateWt(ICollection<CalculationConditionItem> conditions, ICollection<CalculationResultItem> results) { if (conditions != null && results != null) { //计算前将results集合清空 results.Clear(); //得到所有组的总tmp和 double sumAllTmp = conditions.Sum(c => c.MoleWeight * c.At); var query = from c in conditions group c by c.GroupName into g select new { GroupName = g.Key, GroupAtSum = g.Sum(c => c.At), GroupAtMoleSum = g.Sum(c => c.MoleWeight * c.At), GroupCount = g.Count(), g }; foreach (var item in query) { CalculationResultItem tmpCalculationResultItem = new CalculationResultItem(); tmpCalculationResultItem.Id = Guid.NewGuid(); tmpCalculationResultItem.GroupName = item.GroupName; //按照组类生成名称和临时值,分两种情况,一个一组,和多个一组 StringBuilder sb = new StringBuilder(); if (item.GroupCount == 1) { sb.Append(item.g.FirstOrDefault().MaterialName); } else { foreach (var c in item.g) { //该组分名称当中是否包含多个元素,也就是说该组分是否是化合物形式存在 //判断方法就是大写字母的数量是否大于等于2 //如果是就加括号 if (CheckCapitalLetterMoreThanOne(c.MaterialName)) { sb.Append("("); sb.Append(c.MaterialName); sb.Append(")"); } else { sb.Append(c.MaterialName); } //保留两位小数 sb.Append((c.At / item.GroupAtSum * 100).ToString("N2")); } } tmpCalculationResultItem.GroupComposition = sb.ToString(); tmpCalculationResultItem.Wt = item.GroupAtMoleSum / sumAllTmp; tmpCalculationResultItem.Weight = 0; results.Add(tmpCalculationResultItem); } } }
public void CalcualteWithOneGroupWeight(CalculationResultItem alreadyKnownGroup, double groupWeight, ICollection<CalculationResultItem> results, out double totalWeight) { if (groupWeight > 0) { totalWeight = groupWeight / (alreadyKnownGroup.Wt); //首先得知总重量,然后调用总重量已知的计算方法 CalculateWithTotalWeight(results, totalWeight); } else { totalWeight = 0; } }