VB.NET中Linq用法究竟如何掌握?
- 内容介绍
- 文章标签
- 相关推荐
本文共计984个文字,预计阅读时间需要4分钟。
我有一个类如下所示:Class Scan Delivered As Boolean ScanDate As Date State As String Facility As StringEnd Class然后我创建了一个列表并用包包含任何内容的扫描描述填充它。Dim Scans As New List(Of Scan)我需要探究清空列表。

Class Scan Delivered As Boolean ScanDate As Date State As String Facility As String End Class
然后我创建一个列表并用包含任何内容的扫描填充它.
Dim Scans As New List(Of Scan)
我需要挖掘清单以获取各种信息.我想用LINQ来做.问题是,对于我的生活,我只是没有得到它.语法将我抛弃,结果不是强类型的事实会让我失望,并且Web上的示例过于简单或过于复杂.

我怎么能
>获取扫描计数,按日期分配Delivered = True
>获取扫描计数,按设施分组,其中Delivered = True
>获取扫描计数,按状态分组,其中Delivered = True
然后我想在For Each循环中使用它.
For Each result In GroupedResults ‘My Code Next
理想情况下,我希望结果是强类型的.这可能吗?
任何人都可以推荐一些链接来开始这个?我遇到的每个网站都让我头脑发热.我根本不理解它.
编辑:
十分感谢大家.我仍然对这些东西感到头疼,但至少这是一个真实世界的例子,我可以用它来了解发生了什么.
我希望这个简单的例子可以帮助我进入一个更复杂的用途 – 没有运气.我本来应该这样做了.
所有示例似乎都使用键/值响应.如果我需要分组两个值,该怎么办?
Class Scan Delivered As Boolean Scanned As Boolean ScanDate As Date State As String Facility As String End Class 1. Get a count of Delivered = True, a count of Scanned=True, grouped by Date 2. Get a count of Delivered = True, a count of Scanned=True, grouped by Facility 3. Get a count of Delivered = True, a count of Scanned=True, grouped by State
是否有可能在一个结果中得到这个?
编辑编辑:
回答了我自己的编辑!这似乎对我有用:
Dim query = From r In scans _ Group r By r.ScanDate Into g = Group _ Select New With _ {g, .DeliveredCount = g.Count(Function(s) s.Delivered), .ScannedCount = g.Count(Function(s) s.Scanned)}
十分感谢大家.你让我到了可以解决问题的地步.我仍然没有“得到”我正在做的事情(什么是函数?!),但我有一些东西可以开始.我打算花时间学习这个.我认为真正让我失望的是网上的样本是C#. Normaly我没有转换语法的问题,但是使用LINQ并不是那么简单.我以为我做错了什么,但只是语法非常不同.
您不限于使用LINQ的查询语法.您还可以在集合上使用LINQ扩展方法.您将收到的结果将是强类型.虽然在不返回现有类型时将使用匿名类型.
下面的代码是C#,但你会明白:
static void Main( string[] args ) { List<Scan> scans = new List<Scan> (); scans.Add (new Scan (new DateTime (2010, 1, 1), true, "Facility1")); scans.Add (new Scan (new DateTime (2010, 1, 1), true, "Facility2")); scans.Add (new Scan (new DateTime (2010, 1, 1), false, "Facility3")); scans.Add (new Scan (new DateTime (2010, 1, 26), true, "Facility1")); var result1 = scans.Where (s => s.Delivered).GroupBy (s => s.ScanDate); foreach( var r in result1 ) { Console.WriteLine (String.Format ("Number of delivered scans for {0}: {1}", r.Key, r.Count ())); } var result2 = scans.Where (s => s.Delivered).GroupBy (s => s.Facility); foreach( var r in result2 ) { Console.WriteLine (String.Format ("Number of delivered scans for {0}: {1}", r.Key, r.Count ())); } Console.ReadLine (); }
此处的结果并非真正类型化,因为GroupBy表达式返回IGrouping类型.
但是,通过这样做,你可以解决这个问题:
var result2 = scans.Where (s => s.Delivered) .GroupBy (s => s.Facility) .Select( s => new { Facility = s.Key, NumberOfItems = s.Count() } );
使用LINQ提供的扩展方法,可能会帮助您更多地理解它.
对不起C#语法,但我对VB.NET并不熟悉.
本文共计984个文字,预计阅读时间需要4分钟。
我有一个类如下所示:Class Scan Delivered As Boolean ScanDate As Date State As String Facility As StringEnd Class然后我创建了一个列表并用包包含任何内容的扫描描述填充它。Dim Scans As New List(Of Scan)我需要探究清空列表。

Class Scan Delivered As Boolean ScanDate As Date State As String Facility As String End Class
然后我创建一个列表并用包含任何内容的扫描填充它.
Dim Scans As New List(Of Scan)
我需要挖掘清单以获取各种信息.我想用LINQ来做.问题是,对于我的生活,我只是没有得到它.语法将我抛弃,结果不是强类型的事实会让我失望,并且Web上的示例过于简单或过于复杂.

我怎么能
>获取扫描计数,按日期分配Delivered = True
>获取扫描计数,按设施分组,其中Delivered = True
>获取扫描计数,按状态分组,其中Delivered = True
然后我想在For Each循环中使用它.
For Each result In GroupedResults ‘My Code Next
理想情况下,我希望结果是强类型的.这可能吗?
任何人都可以推荐一些链接来开始这个?我遇到的每个网站都让我头脑发热.我根本不理解它.
编辑:
十分感谢大家.我仍然对这些东西感到头疼,但至少这是一个真实世界的例子,我可以用它来了解发生了什么.
我希望这个简单的例子可以帮助我进入一个更复杂的用途 – 没有运气.我本来应该这样做了.
所有示例似乎都使用键/值响应.如果我需要分组两个值,该怎么办?
Class Scan Delivered As Boolean Scanned As Boolean ScanDate As Date State As String Facility As String End Class 1. Get a count of Delivered = True, a count of Scanned=True, grouped by Date 2. Get a count of Delivered = True, a count of Scanned=True, grouped by Facility 3. Get a count of Delivered = True, a count of Scanned=True, grouped by State
是否有可能在一个结果中得到这个?
编辑编辑:
回答了我自己的编辑!这似乎对我有用:
Dim query = From r In scans _ Group r By r.ScanDate Into g = Group _ Select New With _ {g, .DeliveredCount = g.Count(Function(s) s.Delivered), .ScannedCount = g.Count(Function(s) s.Scanned)}
十分感谢大家.你让我到了可以解决问题的地步.我仍然没有“得到”我正在做的事情(什么是函数?!),但我有一些东西可以开始.我打算花时间学习这个.我认为真正让我失望的是网上的样本是C#. Normaly我没有转换语法的问题,但是使用LINQ并不是那么简单.我以为我做错了什么,但只是语法非常不同.
您不限于使用LINQ的查询语法.您还可以在集合上使用LINQ扩展方法.您将收到的结果将是强类型.虽然在不返回现有类型时将使用匿名类型.
下面的代码是C#,但你会明白:
static void Main( string[] args ) { List<Scan> scans = new List<Scan> (); scans.Add (new Scan (new DateTime (2010, 1, 1), true, "Facility1")); scans.Add (new Scan (new DateTime (2010, 1, 1), true, "Facility2")); scans.Add (new Scan (new DateTime (2010, 1, 1), false, "Facility3")); scans.Add (new Scan (new DateTime (2010, 1, 26), true, "Facility1")); var result1 = scans.Where (s => s.Delivered).GroupBy (s => s.ScanDate); foreach( var r in result1 ) { Console.WriteLine (String.Format ("Number of delivered scans for {0}: {1}", r.Key, r.Count ())); } var result2 = scans.Where (s => s.Delivered).GroupBy (s => s.Facility); foreach( var r in result2 ) { Console.WriteLine (String.Format ("Number of delivered scans for {0}: {1}", r.Key, r.Count ())); } Console.ReadLine (); }
此处的结果并非真正类型化,因为GroupBy表达式返回IGrouping类型.
但是,通过这样做,你可以解决这个问题:
var result2 = scans.Where (s => s.Delivered) .GroupBy (s => s.Facility) .Select( s => new { Facility = s.Key, NumberOfItems = s.Count() } );
使用LINQ提供的扩展方法,可能会帮助您更多地理解它.
对不起C#语法,但我对VB.NET并不熟悉.
