LINQ Group by 多列值在C#与VB.Net上写法的区别

Linq 解决 数据的多字段分组统计(VB.net Sub Main dim objs as array = { _ new with { .Item="A", .Loc="L1", .Q1 = 1, .Q2=0}, _ new with { .Item="A", .Loc="L1", .Q1 = 2, .Q2=1}, _ new with { .Item="B", .Loc="L1", .Q1 = 3, .Q2=99}, _ 阅读详情

现有这样一个LIST,需要根据Age和Sex两列进行Group by 分组操作:

 

	 var  empList =new List<Employee>
	 {
		new Employee {ID = 1, FName = "John", Age = 23, Sex = 'M'},
		new Employee {ID = 2, FName = "Mary", Age = 25, Sex = 'F'},
		new Employee {ID = 3, FName = "Amber", Age = 23, Sex = 'M'},
		new Employee {ID = 4, FName = "Kathy", Age = 25, Sex = 'F'},
		new Employee {ID = 5, FName = "Lena", Age = 27, Sex = 'F'},
		new Employee {ID = 6, FName = "Bill", Age = 28, Sex = 'M'},
		new Employee {ID = 7, FName = "Celina", Age = 27, Sex = 'F'},
		new Employee {ID = 8, FName = "John", Age = 28, Sex = 'M'} 
	 };



用C# 很好实现,一般这样来写LINQ语句:

	// query with lamda	expression
	var QueryWithLamda = empList.GroupBy(x => new { x.Age,  x.Sex})
	            .Select(g=>new {g.Key, Count=g.Count()}); 
	
	//query with standard expression
	var query=from el in empList
	          group el by new {el.Age,el.Sex} into g
			  select new {g.Key, Count=g.Count()}; 

 

现在需要用VB.Net来实现,根据上边C#的写法,很容易想到这样来写:

	' query with lamda	expression	
	Dim QueryWithLamda =  empList.GroupBy(Function(x)  New With { .Age=x.Age, .Sex= x.Sex}) _ 
								 .Select(Function(g) New With {g.Key, g.Count()})  

	
	' query with standard expression
	Dim Query = From el In empList _ 
			    Group el By Key = new with { el.Age,  el.Sex} Into g= Group  _ 
			    Select New  With {.key = Key, _
								.count = g.Count()} 

 

但是打印一下结果发现不对,后来仔细研究了下,原来问题出在这:

Group el By Key = new with {el.Age, el.Sex} Into g= Group _

 

换成这样,结果就和C#的一样了:

Group el By Key = new with{key el.Age, key el.Sex} Into g= Group  _

 

看来在VB.NET中,匿名类和C#不一样,当Group by多列时,需要全部指定它们为Key,不然不会将它们作为一个整体进行group by

 

以下是全部代码:
C#:

void Main()
{
	 var  empList =new List<Employee>
	 {
		new Employee {ID = 1, FName = "John", Age = 23, Sex = 'M'},
		new Employee {ID = 2, FName = "Mary", Age = 25, Sex = 'F'},
		new Employee {ID = 3, FName = "Amber", Age = 23, Sex = 'M'},
		new Employee {ID = 4, FName = "Kathy", Age = 25, Sex = 'F'},
		new Employee {ID = 5, FName = "Lena", Age = 27, Sex = 'F'},
		new Employee {ID = 6, FName = "Bill", Age = 28, Sex = 'M'},
		new Employee {ID = 7, FName = "Celina", Age = 27, Sex = 'F'},
		new Employee {ID = 8, FName = "John", Age = 28, Sex = 'M'} 
	 };
		
	// query with lamda	expression
	var QueryWithLamda = empList.GroupBy(x => new { x.Age,  x.Sex})
	            .Select(g=>new {g.Key, Count=g.Count()}); 
	
	//query with standard expression
	var query=from el in empList
	          group el by new {el.Age,el.Sex} into g
			  select new {g.Key, Count=g.Count()}; 
 
	foreach (var employee in query /* Or  QueryWithLamda */ )
			 Console.WriteLine(employee.Count);
	 
}

public class Employee
{
  public int ID {get;set;}
  public string FName {get;set;}
  public int Age {get;set;}
  public char Sex {get;set;}
}


 


VB.NET代码:

Sub Main
	 Dim empList As New List(Of Employee)()
		empList.Add(New Employee() With _
		{.ID = 1, .FName = "John", .Age = 23, .Sex = "M"c}) 
		empList.Add(New Employee() With _
		{.ID = 2, .FName = "Mary", .Age = 25, .Sex = "F"c})
		empList.Add(New Employee() With _
		{.ID = 3, .FName = "Amber", .Age = 23, .Sex = "M"c}) 
		empList.Add(New Employee() With _
		{.ID = 4, .FName = "Kathy", .Age = 25, .Sex = "F"c})
		empList.Add(New Employee() With _
		{.ID = 5, .FName = "Lena", .Age = 27, .Sex = "F"c}) 
		empList.Add(New Employee() With _
		{.ID = 6, .FName = "Bill", .Age = 28, .Sex = "M"c})
		empList.Add(New Employee() With _
		{.ID = 7, .FName = "Celina", .Age = 27, .Sex = "F"c}) 
		empList.Add(New Employee() With _
		{.ID = 8, .FName = "John", .Age = 28, .Sex = "M"c})
		
	' query with lamda	expression	
	Dim QueryWithLamda = empList.GroupBy(Function(x)  New With { Key x.Age, Key x.Sex}) _
	            				.Select(Function(g) New With {g.Key, g.Count()}) 
	
	' query with standard expression
	Dim QueryWithStanard = From el In empList _ 
			    Group el By Key = new with {Key el.Age, Key el.Sex} Into g= Group  _ 
			    Select New  With {.key = Key, _
								.count = g.Count()} 
								
	Dim QueryWithStanard2 = From el In empList _ 
			    Group el By Key = el.Age,  el.Sex  Into g= Group  _ 
			    Select New  With {.key = Key, _
								.count = g.Count()} 							
 
	For Each employee In QueryWithLamda  'Or  QueryWithLamda
			 Console.WriteLine(employee.Count)
	Next employee 

End Sub
Public Class Employee 
		Private privateID As Integer
		Public Property ID() As Integer 

			Get 
				Return privateID
			End Get 

			Set(ByVal value As Integer) 
				privateID = value
			End Set 

		End Property 

		Private privateFName As String 
		Public Property FName() As String
			Get 
				Return privateFName
			End Get 

			Set(ByVal value As String) 
				privateFName = value
			End Set 
		End Property  

		Private privateAge As Integer 
		Public Property Age() As Integer
			Get 
				Return privateAge
			End Get 

			Set(ByVal value As Integer) 
				privateAge = value
			End Set 
		End Property  

		Private privateSex As Char 
		Public Property Sex() As Char
			Get 
				Return privateSex
			End Get 

			Set(ByVal value As Char) 
				privateSex = value
			End Set 
		End Property
End Class 


 

 

相关讲讨论讨论帖子:

 

http://topic.csdn.net/u/20120529/16/2648950b-26b4-4b90-aa9a-05dff88c85f4.html

http://stackoverflow.com/questions/10801859/linq-group-by-multiple-values-does-not-work-well-in-vb-net-but-work-well-in-c-sh

http://social.microsoft.com/Forums/zh-CN/adonetzhchs/thread/7f06ff9e-a704-411e-9220-7a86963a290e

 

 

vb.netLINQ的各个实用用法 VB.NET中,LINQ(Language Integrated Query)提供了丰富的查询功能,使得编写针对各种数据源的查询变得简单且一致。:根据给定条件从数据源中筛选出符合条件的元素。假设有一个Students:对数据源中的元素进行升序或降序排序。对于一个Products。 阅读详情

相关推荐

.NET技术演进开发者成长心法:兼容性、源码阅读跨栈建模

编程语言运行时框架的演进,本质是工程哲学在兼容性、抽象能力可维护性之间的持续权衡。.NET的向后兼容设计并非技术保守,而是基于二进制兼容、源码稳定运行时沙箱的系统性保障;async/await等语法糖背后是状态机IOCP的底层协同,揭示了异步编程的本质逻辑;而将TPLGCD、MVC路由Rails路由对照理解,则体现了跨技术栈建模的价——它让知识从离散点升级为可迁移的网络。这种‘读源码→解框架→连生态’的学习路径,正是中高级开发者突破技术瓶颈、构建长期竞争力的核心方法论。

412

linq to DataTable group by用法(VB.Net语法)

Module Module1 Sub Main() Dim table As New DataTable table.Columns.Add("A", GetType(Integer)) table.Columns.Add("B", GetType(Integer)) table.Columns.Add("C", GetT

Osiris 7629

Diffix3D+复现

上下载模型,将其放在一个目录中,并将目录名填在demo代码中from_pretrained的cache_dir参数里。目录结构应该是"<PATH>/nvidia/difix/…给的requirements文件中pytorch和xformers的版本没有指定,这里测试过以下版本,可以成功运行。将readme中的demo代码新建一个python脚本复制进去,然后将脚本放在src目录中运行。如果遇到网络问题无法加载huggingface上的预训练模型,可以手动从。如果出现,以下错误重新。

NeverMakeIt的博客 1057

Ef数据GroupBy多字段查询Vb.netc#参考

Dim g = lst.Data.GroupBy(Function(T) New With { Key T.mName, Key T.mU...

568

进阶系列(9)——linq

一、揭开linq的神秘面纱(一)概述 LINQ的全称是Language Integrated Query,中文译成“语言集成查询”。LINQ作为一种查询技术,首先要解决数据源的封装,大致使用了三大组件来实现这个封装,分别是LINQ to Object、LINQ to ADO.NETLINQ to XML。它们和.NET语言的关系如下 要使用LINQ来编程,...

anbixu9818的博客 238

VS08新特性之LINQ 基础

。回顾请说出三条以上 C# 3.0 的新特性请说出扩展方法定义的语法格式使用 var 和 object 声明变量有什么区别?。本章任务编写 LINQBasic 程序使用Lambda表达式查询数组使用委托和匿名方法操作字符串。本章目标掌握 LINQ 中的基本概念掌握 LINQ 的组成理解委托和匿名方法理解 Lambda 表达式掌握基本查询方法:Select()Where()OrderBy()

aabbcczy的专栏 1286

处理 Exists

处理 Exists #r @"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Data.Linq.dll";; #r @"E:\Projects\F#3\FSharp.Data.TypeProviders.dll";; open Microsoft.FSharp.Dat

心想事成 650

VB.net中,LINQ有什么方法属性

==标题==在VB.net中,LINQ有什么方法属性==正文==在VB.NET中使用LINQ(Language Integrated Query),你可以利用一系列的方法和属性来查询和操作内存中的集合(如数组、列表等)以及数据库等数据源。LINQ提供了丰富的功能来简化数据查询和处理的复杂性。虽然LINQ本身不是VB.NET特有的,但VB.NET提供了对LINQ的良好支持,包括语法糖和强大的类型推...

fsyuheduo的博客 1286

VB.NETLINQ TO List泛型查询语句(分组,聚合函数)

Public Class LinqToList 'LINQC#中使用比较方便,但是在VB中使用比较麻烦,复杂,和C#用法并不太一样 Dim listNew As List(Of Product) = New List(Of Product) '新商品 Dim listOld As List(Of Product) = New List(Of Product) '旧商品

1403

Linq语句group by分组语法Ladama表达式

LINQ(Language Integrated Query)是C#和VB.NET中的统一查询语法,用于保存和检索不同来源的数据。它集成在C#或VB中,从而消除了编程语言和数据库之间的不匹配,以及为不同类型的数据源提供单个查询接口。 例如,SQL是一种结构化查询语言,用于保存和检索数据库中的数据。同样的,LINQ是一个用C#和VB.NET构建的结构化查询语法,用于保存和检索来自不同类型数据源的数据...

weixin_44569910的博客 752

C#学习之List的select、where和group by

第四章 C#学习之List的select、where和group by

Justinyh的博客 2万+

vb.net 教程 3-8 窗体编程 容器 1 Panel & GroupBox

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 之前有网友留言问Panel控件的讲解,其实我感觉Panel和GroupBox用法差不多。这里就列在一起讲一下。 上面的图片,能看出来那个是Panel,哪个是GroupBox吗? 其实下面的那个容器是Panel加上一个Label做的。 基本上,容器都是用来放置其它控件的,在容器中的控件受...

学习微软 .net 技术开发 3842

VB.net中,LINQ有什么查询表达式,举例说明

==标题==在VB.net中,LINQ有什么查询表达式,举例说明==正文==在VB.net中,LINQ有什么查询表达式,举例说明在VB.NET中,LINQ(Language Integrated Query)查询表达式提供了一种声明性的方式来查询和操作数据集合。这些查询表达式通过一系列的关键字来定义,这些关键字在编译时会被转换成对集合进行操作的调用(通常是扩展方法)。以下是一些常见的LINQ查询表...

fsyuheduo的博客 916

List Group By 用法

var dealOtherDetail = items.GroupBy(x => new { x.DetailID }).Select(g => new { g.Key.DetailID, qty = g.Sum(a => a.AppointQty) }).ToList(); linq group by多个字段,返回多个字段 直接上例子. var wflist = from u in db.TWelFare where u.fy_no == fy_no orderby u

极客神殿 2391

ORB-SLAM2算法4之KITTI开源数据集运行ORB-SLAM2生成轨迹并用evo工具评估轨迹

ORB-SLAM2算法1 已成功编译安装ORB-SLAM2到本地,本篇目的是用KITTI开源数据来运行ORB-SLAM2,并生成轨迹,最后用evo评估工具来评估ORB-SLAM2生成的轨迹和真轨迹。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 2294

凸包边缘缺陷检测(基于C++OpenCV开发,内含源码)

针对多孔冲压件的边缘缺陷问题,提出了一种基于机器视觉的检测方法。首先在平面光下采集图像,对图像进行灰度化、二化的预处理操作;然后寻找轮廓,根据轮廓面积特征筛选得到零件的有效的内外侧轮廓;接着对内外侧轮廓分类,计算凸包及其凸缺陷;最后,通过凸缺陷的特征筛选得到零件边缘缺陷及其特征信息。实验结果表明,该边缘缺陷检测方法检测速度快、准确率高、鲁棒性好,可有效的满足工厂检测要求。

上一篇: LINQ TO XML 应用之 Win8 Metro 开发
下一篇: [知识分享] LINQ TO SQL 实现无限递归查询
q107770540
博客等级 码龄19年 3075粉丝 53原创
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值