当前位置 : 主页 > 编程语言 > c语言 >

vb.net – 我只是不明白如何使用Linq

来源:互联网 收集:自由互联 发布时间:2021-06-24
我有一个课程如下: Class Scan Delivered As Boolean ScanDate As Date State As String Facility As String End 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并不熟悉.

网友评论