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

现有这样一个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

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值