如何从另一个方法的列表中获取一个结果?

时间:2018-02-13 08:51:57

标签: c#

大家好我是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;
    }
}

3 个答案:

答案 0 :(得分:3)

您可以使用LINQ扩展方法Sum来执行此操作:

decimal total = GetAllKschl( amount, totalAmount ).Sum( result => result.Gesamtpreis );

我认为TotalPriceResult类中价格属性的名称。

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>MinMax,..)或者他们会做返回对象或其他集合的其他一些操作(SumFirstLastToList)。

在我们的护理中,我们将有一个包含对象的列表:

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。