大家好我是C#的新手。
我尝试返回结果" totalAmount"来自我的方法叫做" GetAllKschl"。在这个方法中,我返回了一个列表,其中包含" KSCHL,KSCHLData,price,pieces和totalPrice"。
所以在我的新方法中,我需要所有" totalPrice"在一起。
第一种方法:
public List<Result> GetAllKschl(string fileNameResult, string fileNameData)
{
List<Result> listResult = new List<Result>();
docResult.Load(fileNameResult);
docData.Load(fileNameData);
var resultList = docResult.SelectNodes("//root/CalculationLogCompact/CalculationLogRowCompact");
foreach (XmlNode nextText in resultList)
{
XmlNode KSCHL = nextText.SelectSingleNode("KSCHL");
string nextKschl = KSCHL.InnerText;
// ... and so on...
if (pieces > 0 && totalPrice > 0)
{
listResult.Add(new Result(nextKschl, nextKSCHLData, nextEinzelpreis, pieces, totalPrice));
}
}
return listResult;
}
第二种方法:(不知道该怎么做)
public decimal GetTotalAmount(string amount, string totalAmount)
{
string total = GetAllKschl(amount, totalAmount); // ??
return total;
}
所以这里我想要的是TotalAmount(来自GetAllKschl的每个totalPrice)而不是GetAllKschl的整个列表。我该怎么做?
这是我的班级结果:
public class Result
{
public string KSCHL { get; set; }
public string Info { get; set; }
public int individualPrice { get; set; }
public int Pieces { get; set; }
public int TotalCosts { get; set; }
public Result(string kschl, string info, int individualPrice, int pieces, int totalCosts)
{
KSCHL = kschl;
Info = info;
IndividualPrice = individualPrice;
Pieces = pieces;
TotalCosts = totalCosts;
}
}
答案 0 :(得分:3)
您可以使用LINQ扩展方法Sum
来执行此操作:
decimal total = GetAllKschl( amount, totalAmount ).Sum( result => result.Gesamtpreis );
我认为TotalPrice
是Result
类中价格属性的名称。
Sum
扩展方法迭代返回集合中的所有项目并总结价格。
你可以在没有LINQ的情况下重写这个:
var list = GetAllKschl( amount, totalAmount );
decimal total = 0;
foreach ( var item in list )
{
total += item.Gesamtpreis;
}
作为建议,我建议制定更清晰的变量命名约定,不要混合使用不同语言的变量名(英语和德语)。
在decimal
班级使用Result
时,您使用int
作为总价是非常不寻常的。也许结果也应该decimals
?这似乎适合价格房产。
答案 1 :(得分:2)
最好的可能是使用LINQ:
public decimal GetTotalAmount(string amount, string totalAmount)
{
var total = GetAllKschl(amount, totalAmount).Sum(result => result.Gesamtpreis);
return total;
}
我假设您的结果位于名为Gesamtpreis
的属性中,并且是任何数字类型。
修改强>
基于这些评论,我决定对LINQ扩展方法和lambda方法进行更多描述。 LINQ方法允许您使用类似于SQL的查询语言。它适用于Collection
个元素(例如List
的{{1}} - Result
)。在这个集合中你将调用这些方法,它们将为你提供某种结果,有时只是数字(聚合函数,如List<Result>
,Min
,Max
,..)或者他们会做返回对象或其他集合的其他一些操作(Sum
,First
,Last
,ToList
)。
在我们的护理中,我们将有一个包含对象的列表:
ToDictionary
有了这些,对于普通的SUM,你会选择:
public class Product
{
public string Name { get; set; }
public int Price { get; set; }
}
List<Product> productList = new List<Product>();
productList.Add(new Product() { Name = "Car", Price = 140000 });
productList.Add(new Product() { Name = "SSD Disc", Price = 2000 });
productList.Add(new Product() { Name = "Bananan", Price = 7 });
这是一种短代码,但如果不使用变量(对于中间结果)和int result = 0;
foreach(var nProduct in productList)
result += nProduct.Price;
Console.WriteLine(result);
循环,它可以非常简化。 (实际上将使用foreach循环,但我们不需要处理/写入它。)LINQ示例:
foreach
现在这段代码要短得多,但我们必须将它分成几个部分来理解实际发生的事情:
var result = productList.Sum(nProduct => nProduct.Price);
答案 2 :(得分:0)
//In this method you are returning a List
public List<Result> GetAllKschl(string fileNameResult, string fileNameData)
{
List<Result> listResult = new List<Result>();
docResult.Load(fileNameResult);
docData.Load(fileNameData);
var resultList = docResult.SelectNodes("//root/CalculationLogCompact/CalculationLogRowCompact");
foreach (XmlNode nextText in resultList)
{
XmlNode KSCHL = nextText.SelectSingleNode("KSCHL");
string nextKschl = KSCHL.InnerText;
// ... and so on...
if (pieces > 0 && totalPrice > 0)
{
listResult.Add(new Result(nextKschl, nextKSCHLData, nextEinzelpreis, pieces, totalPrice));
}
}
return listResult;
}
//On the second method you returning a decimal and expecting a string
public decimal GetTotalAmount(string amount, string totalAmount)
{
string total = GetAllKschl(amount, totalAmount); // ??
return total;
}
最好将第二种方法更改为:
decimal total = GetAllKschl(amount, totalAmount).Sum(result => result.Gesamtpreis);
在回报中添加linq。