微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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中,它显然有所不同.
>为什么MS选择使VB的匿名类型变得可变.我没有看到真正的优势,而在这个问题之后,我看到一些非常真正的缺点.也就是说你的linq查询可以有微妙的错误.

– 编辑 –

只是一个有趣的额外的信息…显然这是关键的财产问题是广为人知的.我只是不知道Google的内容.已经在stackoverflow上讨论了herehere.以下是使用匿名类型和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#以它的方式工作尽管:)即使可以认为,使属性可选的可变是有道理的,我不明白为什么它应该是认的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


原文地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx 原文发布日期: 9/19/2005 原文已经被 Microsoft 删除了,收集过程中发现很多文章图都不全,那是因为原文的图都不全,所以特收集完整全文。 目录 前言 CLR启动程序
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采纳和使用,它的确提供了很多的优势也解决了很多的问题,但是我们也知道也并不是银弹,提供优势的同时它也给我们的开发人员和团队也带来了很多的挑战。 为了迎接或者采用这些新技术,开发团队需要更加注重一些流程或工具的使用,这样才能更好的适应这些新技术所
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下PLINQ中的分区。上一篇介绍了并行编程,这边详细介绍一下并行编程中的分区和自定义分区。 先做个假设,假设我们有一个200Mb的文本文件需要读取,怎么样才能做到最优的速度呢?对,很显然就是拆分,把文本文件拆分成很多个小文件,充分利用我们计算机中
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Microsoft为了利用这个硬件特性,于是在Visual Studio 2010 和 .NET Framework 4的发布及以上版本中,添加了并行编程这个新特性,我想它以后势必会改变我们的开发方式。 在以前或者说现在,我们在并行开发的时候可
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么
c语言怎么求字符串的长度并输出
c语言函数的三种调用方式是什么
c语言中保留两位小数怎么表示
double的输入格式符是什么