枚举多次的.Net方法应接受哪种类型的集合作为参数?

时间:2019-04-08 11:32:19

标签: c# .net enumerable

我有一个简单的方法,像这样:

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中有解决此问题的“首选”方法吗?

4 个答案:

答案 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可以正常工作。