Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算计算属性的最佳方法是Linq还是foreach循环?_C#_Performance_Linq_Foreach - Fatal编程技术网

C# 计算计算属性的最佳方法是Linq还是foreach循环?

C# 计算计算属性的最佳方法是Linq还是foreach循环?,c#,performance,linq,foreach,C#,Performance,Linq,Foreach,事实上,我的代码可以用三种不同的方式进行测试,但我想知道实现它的最佳方式是什么 拥有一个包含集合的Vehicle.cs类,并希望计算所有条目的平均消耗量 这项工作: public ICollection<FuelingEntry> FuelingEntries { get; set; } public double TotalAverageConsumption { get { double fuelingEntriesQuantitySum = 0

事实上,我的代码可以用三种不同的方式进行测试,但我想知道实现它的最佳方式是什么

拥有一个包含集合的Vehicle.cs类,并希望计算所有条目的平均消耗量

这项工作:

public ICollection<FuelingEntry> FuelingEntries { get; set; }

public double TotalAverageConsumption
{
    get
    {
        double fuelingEntriesQuantitySum = 0;
        double fuelingEntriesTripOdometerSum = 0;

        foreach (var fuelingEntry in FuelingEntries)
        {
            fuelingEntriesQuantitySum += fuelingEntry.Quantity;
            fuelingEntriesTripOdometerSum += fuelingEntry.TripOdometer;
        }

        return (fuelingEntriesQuantitySum / fuelingEntriesTripOdometerSum) * 100;
    }
}
public ICollection{get;set;}
公共双总平均消费
{
收到
{
double fuelingEntriesQuantitySum=0;
双燃料里程计SUM=0;
foreach(fuelingEntry中的var fuelingEntry)
{
fuelingEntriesQuantitySum+=fuelingEntry.Quantity;
fuelingEntriesTripOdometerSum+=fuelingEntry.TripOdometer;
}
返回值(FuelingEntitySum/fuelingEntriesTripOdometerSum)*100;
}
}
还有“基本”LINQ:

public ICollection<FuelingEntry> FuelingEntries { get; set; }

public double TotalAverageConsumption
{
    get
    {
        var fuelingEntriesQuantitySum = (from f in FuelingEntries select f.Quantity).Sum();
        var fuelingEntriesTripOdometerSum = (from f in FuelingEntries select f.TripOdometer).Sum();

        // var fuelingEntriesQuantitySum = FuelingEntries.Select(f => f.Quantity).Sum();
        // var fuelingEntriesTripOdometerSum = FuelingEntries.Select(f => f.TripOdometer).Sum();

        return (fuelingEntriesQuantitySum / fuelingEntriesTripOdometerSum) * 100;
    }
}
public ICollection{get;set;}
公共双总平均消费
{
收到
{
var fuelingEntriesQuantitySum=(从FuelingEntries中的f选择f.Quantity.Sum();
var fuelingentriestripedometersum=(从FuelingEntries中的f选择f.tripometer.Sum();
//var fuelingEntriesQuantitySum=FuelingEntries.Select(f=>f.Quantity.Sum();
//var fuelingentriestripedometersum=FuelingEntries.Select(f=>f.tripometer.Sum();
返回值(FuelingEntitySum/fuelingEntriesTripOdometerSum)*100;
}
}

哪种方法是最好的,或者还有另一种方法?

如本文所述,使用
foreach
循环的第一个选项更有效,因为您只需循环一次集合,您的linq版本循环两次。如果您在访问属性时可以更新集合或集合项,则这两种方法都将很容易失败或产生奇怪的结果。

LINQ版本是两个循环,而
foreach
则是一个循环。但是,LINQ版本可以简化为一条语句,但无论您做什么,这更多是一个偏好问题。在Visual Studio中使用profiler,您可以更好地了解应该优化的内容。