[英]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 代碼,我同時擁有Item1
和Group
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.