c# – VB.NET linq组与匿名类型不能按预期工作
我正在用LINQPad附带的一些
linq示例.在“C#3.0 in Nutshell”文件夹中,在Chater 9 – 分组下,有一个称为“按多个键分组”的示例查询.它包含以下查询:
from n in new[] { "Tom","Dick","Harry","Mary","Jay" }.AsQueryable() group n by new { FirstLetter = n[0],Length = n.Length } 我将字符串“Jon”添加到数组的末尾以获得实际的分组,并提出以下结果: 这正是我期待的.那么在LINQPad中,我去了VB.NET版本的同一个查询: ' Manually added "Jon" from n in new string() { "Tom","Jay","Jon" }.AsQueryable() _ group by ng = new with _ { _ .FirstLetter = n(0),_ .Length = n.Length _ } into group 结果没有正确地将Jay / Jon组合在一起. 拉出我的头发一点,我发现了this MSDN article讨论VB.NET匿名类型.在VB.NET中,它们默认是可变的,而不是C#,它们是不可变的.在VB中,您需要添加Key关键字使其不可变.所以我改变了这个查询(注意添加了Key): from n in new string() { "Tom","Jon" }.AsQueryable() _ group by ng = new with _ { _ Key .FirstLetter = n(0),_ Key .Length = n.Length _ } into group 这给了我正确的结果: 所以我的问题是这样的: >为什么当linq进行平等比较时,匿名类型的可变性/不可变性是重要的?值得注意的是,在Linq-to-SQL中,这并不重要,这可能只是SQL转换的一个产物.但是在Linq-to-objects中,它显然有所不同. – 编辑 – 只是一个有趣的额外的信息…显然这是关键的财产问题是广为人知的.我只是不知道Google的内容.已经在stackoverflow上讨论了here和here.以下是使用匿名类型和Distinct的问题的另一个示例: Dim items = New String() {"a","b","c","c"} Dim result = items.Select(Function(x) New With {.MyValue = x}).Distinct() Dim result2 = items.Select(Function(x) New With {Key .MyValue = x}).Distinct() 'Debug.Assert(result.Count() = 3) ' Nope... it's 6! Debug.Assert(result2.Count() = 3) 解决方法
Key修饰符不仅影响可变性 – 它还会影响Equals和GetHashCode的行为.这些计算中只包含关键属性…这明显影响分组等
至于为什么它是不同的VB – 我不知道.对我也好奇怪我知道我很高兴C#以它的方式工作尽管:)即使可以认为,使属性可选的可变是有道理的,我不明白为什么它应该是默认的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- stored-procedures – 通过调度程序作业将参数传递给oracle
- postgresql – 如何创建docker-compose版本2以使用卷拥有持
- (收藏)正则表达式
- 利用Ajax实现长连接(模拟推送,半长连接)
- postgresql – pg_dump:[archiver(db)]与数据库的连接失败
- c – std :: vector push_back(Object())和push_back(new O
- 为什么我会收到警告:(接近初始化’ptr’)和运行时的分段错误
- c# – 使用“using”关键字时会被处置的内容
- hdu3076--ssworld VS DDD(概率dp第三弹,求概率)
- flash 导出 swc 到flex中用