在为业务逻辑对象编写一些扩展方法时,我遇到了重命名转换方法的问题。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‽的结构