簡體   English   中英

使用 LINQ,我可以像在 C# 中那樣給 VB.NET 中的“分組”命名嗎?

[英]Using LINQ, can I give the "grouping" a name in VB.NET like I can in C#?

我的目標是對數據進行分組和轉換,但同時提供轉換后和未轉換的“分組數據”。

考慮以下最小的 C# 示例:

var data = new[] { ("a", 1), ("a", 2), ("b", 1) };

var groupedAndTransformed =
    from d in data
    group d by d.Item1 into g
    select new
    {
        Untransformed = g,
        Transformed = g.Key + string.Join(",", g.Select(tuple => tuple.Item2))
    };

現在我嘗試在 VB.NET 中做同樣的事情,但我只能通過兩步過程來實現,因為 VB.NET 的Group By依據與 C# 的group by有些不同:

Dim data = {("a", 1), ("a", 2), ("b", 1)}

Dim step1 =
    From d In data
    Group d By d.Item1 Into Group

Dim groupedAndTransformed =
    From g In step1
    Select
        Untransformed = g,
        Transformed = g.Item1 + String.Join(",", g.Group.Select(Function(tuple) tuple.Item2))

問題似乎是 VB.NET 的Group By將分組的結果放入某種“全局名稱空間”:如果我在Group d By d.Item1 Into Group之后繼續直接編寫 LINQ 代碼,我同時擁有Item1Group scope。但是,我沒有由它們組成的IGrouping的名稱(在 C# 中稱為g ),所以我需要第二步。

我能以某種方式告訴 VB 的Group By語句給我IGrouping的名稱嗎? 我發現的唯一其他解決方法是使用 (a) 函數式語法而不是聲明性 LINQ 語法(即,直接調用Enumerable.GroupBy )或(b)將 step1 嵌套到第二步(即, From g In (...step1...) )。 我錯過了什么嗎?

C# 和 VB LINQ 語法如此不兼容真是太糟糕了。 我認為以下 VB LINQ 與原始版本盡可能接近(當然使用 Option Infer On):

Dim data = { ("a", 1), ("a", 2), ("b", 1) }

Dim groupedAndTransformed = From d In data
    Group d By d.Item1 Into g = Group
    Select New With {
        Key .Untransformed = g,
        Key .Transformed = Item1 & String.Join(",", g.Select(Function(tuple) tuple.Item2))
    }

我已經測試過,它可以編譯和運行,但很難判斷它是否會 function 相同。

Dave 所說的,但我只是想指出,總體而言,使用方法語法可能更整潔:


    Dim groupedAndTransformed = data.GroupBy(
        Function(d) d.Item1,
        Function(k, g) New With {
            Key .Untransformed = g
            Key .Transformed = g.Select(Function(tuple) tuple.Item2)
        }
    )

或者如果你想轉儲未轉換的,有一個重載將有助於減少子選擇


    Dim groupedAndTransformed = data.GroupBy(
        Function(d) d.Item1,
        Function(d) d.Item2,
        Function(k, g) New With {
            Key .Transformed = k & String.Join(",", g)
        }
    )

我希望他們Function縮短為F

在發布的 C# 代碼中,變量g的類型為 System.Linq.Lookup.Grouping。 此類型是System.Linq.Lookup 類型的內部 class。 由於 LINQ 的目的似乎是提取查找分組,因此編寫查詢以使用Enumerable.ToLookup 方法來創建可枚舉的分組可能會更好。

var groupedAndTransformed = from grp in data.ToLookup((item) => item.Item1)
                            select new
                            {
                              Untransformed = grp,
                              Transformed = grp.Key + string.Join(",", grp.Select((tuple) => tuple.Item2))
                            };

這可以直接翻譯成VB代碼。

Dim groupedAndTransformed = From grp In data.ToLookup(Function(item) item.Item1)
                            Select New With
                             {
                               Key .Untransformed = grp,
                               Key .Transformed = grp.Key & String.Join(",", grp.Select(Function(tuple) tuple.Item2))
                             }

我意識到這並沒有回答如何強制 VB 的“Group By”使用與 C# 編譯器發出的相同內部實現的問題,但是您真的想要依賴於實現細節的代碼嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM