相关疑难解决方法(0)

参数的最佳实践:IEnumerable与IList对比IReadOnlyCollection

当得到延迟执行的值时,我会从一个方法返回一个IEnumerable.并且返回a List或者IList应该只是在结果将被修改时,否则我将返回一个IReadOnlyCollection,所以调用者知道他得到的不是用于修改(这使得该方法甚至可以重用来自其他调用者的对象) ).

但是,在参数输入方面,我有点不太清楚.我可以拿一个IEnumerable,但如果我需要不止一次枚举怎么办?

俗话说" 你所发送的是保守的,你接受的是自由主义",这表明服用IEnumerable是好的,但我并不确定.

例如,如果以下IEnumerable参数中没有元素,则可以通过.Any()先检查在此方法中保存大量工作,这在此ToList()之前需要避免枚举两次.

public IEnumerable<Data> RemoveHandledForDate(IEnumerable<Data> data, DateTime dateTime) {
   var dataList = data.ToList();

   if (!dataList.Any()) {
      return dataList;
   }

   var handledDataIds = new HashSet<int>(
      GetHandledDataForDate(dateTime) // Expensive database operation
         .Select(d => d.DataId)
   );

   return dataList.Where(d => !handledDataIds.Contains(d.DataId));
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道什么是最好的签名,在这里?一种可能性是IList<Data> data,但接受列表表明您打算修改它,这是不正确的 - 这种方法不会触及原始列表,所以IReadOnlyCollection<Data>看起来更好.

但是,即使使用自定义扩展方法,也会IReadOnlyCollection强制调用者 …

c# collections parameters

12
推荐指数
2
解决办法
2005
查看次数

标签 统计

c# ×1

collections ×1

parameters ×1