在为业务逻辑对象编写一些扩展方法时,我遇到了重命名转换方法的问题。someObject.ToAnotherObject()与广泛使用会很好object.ToString()。
但是,例如LINQ,将两种变体混合在一起,我找不到它们之间的区别。ToDictionary(),ToList(),AsParallel(),AsQueryable(),...
这两种命名约定之间有什么区别,我应该知道什么才能决定是否将其用于自己的类?
Answers:
ToDictionary并ToList加上前缀,To因为它们不一定保留原始集合的结构标识或其属性。
List<T>转换为Dictionary<K, V>会创建一个具有全新结构的集合。HashSet<T>转换为aList<T>将删除集合的唯一性属性。带前缀的方法As不做任何事情-它们只是提供原始集合的替代视图。他们丰富了它。
AsCleanApple将改变苹果的某些情况。一个更好的比喻可能是AsFruit
.AsCleanAppleSource()会把苹果的来源变成干净苹果的来源;如果有必要,可以添加一个清洗步骤,但是也许什么也不做,这就是众所周知的苹果是干净的。.ToPunnet()会访问该来源并为您提供一篮苹果。
在Linq中,ToXXX所有方法都执行查询并从结果中创建一个新对象,而这些AsXXX方法产生一个新查询,该查询在某种程度上有所不同。它可以是相同的对象,但通过不同的接口访问(AsEnumerable()做到这一点),或者它可能是一个新的对象,改变功能(其他方法做到这一点,虽然一些检查,看看他们是否可以只返回给定对象,如AsQueryable()将source如果已实现IQueryable<T>,则返回,EnumerableQuery<TElement>否则返回一个新值)。
that alters how the functionality-是how不必要的还是该声明的下一部分?
ToXXX()投影与原始数据无关的数据。AsXXX()保持与原始文件的有效关系(至少在我们正在讨论的Enumerable / Queryable示例中)。
ToXXX execute the query和+1 AsXXX produce a new query。从我在LINQ上阅读的内容来看,听起来似乎很正确,并且MSDN似乎证实了ToXXX,但是我想知道是否有人知道所有 AsXXX方法是否都推迟执行?
AsXXX从而在Linq固有的基础之上添加新的功能(例如,AsParallel由PLinq添加的,AsNoTracking由实体框架提供的,等等)。当然,LINQ的核心是什么,是通过定义Queryable和Enumerable,和这两个类都遵循该公约。大多数添加都在某种程度上做到了“全部”可能是正确的,但是它太开放了,不能保证总是正确的(尽管我会考虑打破任何设计缺陷)。
.AsCleanApple(),因为我只需要洗它,.ToFruitSalad()因为我的刀将改变apple‽的结构