有什么区别
select(a=>a) and select(a=>a.value)
?我在哪里需要第二个?
答案 0 :(得分:3)
第一个(select(a => a)
)是多余的 - 它实际上没有做任何事情。
第二个(select(a => a.value
)称为投影。它将a
(无论是什么)的列表投射到其值列表中。您还没有告诉我们a
或它的价值是什么,但它看起来像是一个字段或属性......
答案 1 :(得分:1)
选择将给定的函数应用于集合中的所有值。
因此, a => a
将元素映射到自身,因此没有任何效果。
a => a.value
将每个元素映射到其value
属性。
答案 2 :(得分:0)
只要您想要访问对象“a”的“value”属性,就需要第二个。
答案 3 :(得分:0)
你已经收到了一些非常可靠的回复,我不打算与其他答案争论,他们很好,但我想在这里尝试不同的方法。
如果你真的没有注意到选择任何对象和选择任何对象的任何属性之间的区别 - 这是一个根本区别 - 我怀疑,你的a
可能是{{1} }。我怀疑这一点,因为如果Nullable<T>
可以为空,那么很多时候你可以互换使用a
和a
,并且可能不会注意到差异。
a.Value
将一个不可为空的类型包装到一个可以为null的类中。获取和设置此属性的值不会直接分配包装器类,但它实际上将为其Nullable<T>
属性分配(或获取)值。 Value
还附带一个布尔属性Nullable<T>
。
如果您的数据库包含一个位字段,比如说该位字段恰好允许空值,那么Linq to SQL(比如说)将把它映射到HasValue
(简写,Nullable<bool>
) 。如果您的表允许为null,但实际上包含任何空值,您可能不会注意到bool?
之间的区别(正如有人指出的那样,冗余)和.Select(myNullableBool => myNullableBool)
,但这里的区别实际上是后者返回.Select(myNullableBool => myNullableBool.Value)
,而前者返回IEnumerable<bool>
。后者假设bool有一个值,所以如果你想安全玩,你应该IEnumerable<Nullable<bool>>
(你可以在你的Select中使用.Where(mNB => mNB.HasValue).Select(mNB => mNB.Value)
方法)。如果标志的空值在模型中没有意义,那么它的数据类型应该是布尔值,而不是可以为空的布尔值。在这种情况下,您要确保选择GetValueOrDefault
而不是整个可空,因为无法将可空布尔值分配给布尔变量。
您的代码没有显示足够的信息,以便能够判断此回复是否与此相关,但我猜这可能是您问题的真正原因。如果它不是(或实际上即使它是),其他人回答的内容仍然是正确的。