我只是不明白如何使用Linq

Bre*_*ett 5 linq vb.net

我有一个课程如下:

Class Scan
    Delivered As Boolean
    ScanDate As Date
    State As String
    Facility As String  
End Class
Run Code Online (Sandbox Code Playgroud)

然后我创建一个列表并用包含任何内容的扫描填充它.

Dim Scans As New List(Of Scan) 
Run Code Online (Sandbox Code Playgroud)

我需要挖掘清单以获取各种信息.我想用LINQ来做.问题是,对于我的生活,我只是没有得到它.语法将我抛弃,结果不是强类型的事实会让我失望,并且Web上的示例过于简单或过于复杂.

我怎么能

  1. 获取扫描计数,按日期分配Delivered = True
  2. 获取扫描计数,按设施分组,其中Delivered = True
  3. 获取扫描计数,按状态分组,其中Delivered = True

然后我想在For Each循环中使用它.

For Each result In GroupedResults
    ‘My Code

Next
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望结果是强类型的.这可能吗?

任何人都可以推荐一些链接来开始这个?我遇到的每个网站都让我头脑发热.我根本不理解它.

编辑:

十分感谢大家.我仍然对这些东西感到头疼,但至少这是一个真实世界的例子,我可以用它来了解发生了什么.

我希望这个简单的例子可以帮助我进入一个更复杂的用途 - 没有运气.我本来应该这样做了.

所有示例似乎都使用键/值响应.如果我需要分组两个值,该怎么办?

    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 
Run Code Online (Sandbox Code Playgroud)

是否有可能在一个结果中得到这个?

编辑编辑:

回答了我自己的编辑!这似乎对我有用:

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)}
Run Code Online (Sandbox Code Playgroud)

十分感谢大家.你让我到了可以解决问题的地步.我仍然没有"得到"我正在做的事情(什么是函数?!),但我有一些东西可以开始.我打算花时间学习这个.我认为真正让我失望的是网上的样本是C#.Normaly我没有转换语法的问题,但是使用LINQ并不是那么简单.我以为我做错了什么,但只是语法非常不同.

Fre*_*els 4

您不限于使用 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 ();

}
Run Code Online (Sandbox Code Playgroud)

这里的结果并不是真正类型化的,因​​为 GroupBy 表达式返回 IGrouping 类型。但是,您可以通过执行以下操作来解决此问题:

 var result2 = scans.Where (s => s.Delivered)
                    .GroupBy (s => s.Facility)
                    .Select( s => new { Facility = s.Key, NumberOfItems = s.Count() } );
Run Code Online (Sandbox Code Playgroud)

使用 LINQ 提供的扩展方法也许可以帮助您更多地理解它。

抱歉 C# 语法,但我不太熟悉 VB.NET。