我的目標是對資料進行分組和轉換,但同時提供已轉換和未轉換的“分組資料”。
考慮以下最小的 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.NETGroup By將分組結果放入某種“全域命名空間”中:如果我在 之后直接繼續撰寫 LINQ 代碼Group d By d.Item1 Into Group,我將兩者Item1兼而有之Group。但是,我沒有IGrouping它們組成的名稱(在 C# 中配音g),所以我需要第二步。
我可以以某種方式告訴 VB 的Group By宣告給我一個名字IGrouping嗎?我發現的唯一其他解決方法是使用 (a) 函式式語法而不是宣告性 LINQ 語法(即Enumerable.GroupBy直接呼叫)或 (b) 將 step1 嵌套到第二步中(即From g In (...step1...))。有什么我錯過的嗎?
uj5u.com熱心網友回復:
在發布的 C# 代碼中,變數g的型別為 System.Linq.Lookup.Grouping。此型別是System.Linq.Lookup 型別的內部類。由于 LINQ 的意圖似乎是提取 Lookup 分組,因此撰寫查詢以使用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 的“分組依據”使用與 C# 編譯器發出的相同內部實作的問題,但是您真的想要依賴于實作細節的代碼嗎?
uj5u.com熱心網友回復:
可惜 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))
}
我已經測驗過,它可以編譯并運行,但很難判斷它是否會發揮相同的作用。
uj5u.com熱心網友回復:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/459313.html
上一篇:參考msgbox上的按鈕
