我有一个简单的方法,像这样:
private void CalculateTotals(IEnumerable<MyData> data)
{
decimal value1 = data.Sum(d => d.Value1);
decimal value2 = data.Sum(d => d.Value2);
}
这有效并且允许传递任何类型的集合,但是这还将执行多个数据枚举,而这可能也非常昂贵。
现在,我可以将参数的类型更改为ICollection<MyData>
,但这意味着调用者不知道该方法是否可以/将更改集合,因为可以在其上调用Add/Remove
。
我的下一个猜测是IReadonlyCollection<MyData>
似乎最合适,但这意味着每个呼叫者都必须创建/转换为新的ReadonlyCollection
。
.Net中有解决此问题的“首选”方法吗?
答案 0 :(得分:5)
我的下一个猜测是
--help
似乎最合适,但这意味着每个呼叫者都必须创建/转换为新的IReadonlyCollection<MyData>
。
不,因为各种内置类型implement that interface:
但是,相反,您可能要防止重复枚举。
答案 1 :(得分:3)
这给您一个枚举:
private void CalculateTotals(IEnumerable<MyData> data)
{
(decimal value1, decimal value2) =
data.Aggregate((0m, 0m), (a, x) => (a.Item1 + x.Value1, a.Item2 + x.Value2));
}
答案 2 :(得分:3)
通常,我建议您使用最不贪婪的接口,以满足您的需求。因此,如果您的方法需要迭代,只需使用最通用的方法<div id = "weatherContainer">
<div id = "weatherDescription">
<h1 id = "cityHeader"></h1>
<div id= "weatherMain">
<div id = "temperature"></div>
<div id = "weatherDescriptionHeader"></div>
<div><img id = "documentIconImg"></div>
</div>
<hr>
<div id = "windSpeed" class = "bottom-details"></div>
<div id = "humidity" class = "bottom-details">></div>
</div>
</div>
。如果需要添加/删除,请使用IEnumerable<T>
,如果需要基于索引的访问,请使用ICollection
。
独立于调用者应提供的内容,您应该优化方法的内部,以避免多次迭代-通常通过以某种方式具体化集合来实现。不要让调用者关心您的方法的内部。这些是实施细节。
最好通过首先转换为列表或数组来检查是否已实现所有集合 :
IList
答案 3 :(得分:-3)
您必须求和。你有一个收藏。您必须枚举。
故事的结尾。
因此,IEnumerable可以正常工作。