我想在VB.net 9中使用C#yield,但它不起作用。
private static IEnumerable<JToken> AllChildren(JToken json)
{
foreach (var c in json.Children())
{
yield return c;
foreach (var cc in AllChildren(c))
{
yield return cc;
}
}
}
这是c#代码,使用在线工具将其转换为VB.net,但它并没有给我带来相同的结果。
Private Shared Function AllChildren(json As JToken) As IEnumerable(Of JToken)
For Each c As var In json.Children()
yield Return c
For Each cc As var In AllChildren(c)
yield Return cc
Next
Next
End Function
有人能帮我翻译一下吗?
我花了一段时间才把它做好,但这正是你所需要的:
Private Shared Iterator Function AllChildren(json As JToken) As IEnumerable(Of JToken)
For Each c As JToken In json.Children()
Yield c
For Each cc As JToken In AllChildren(c)
Yield cc
Next
Next
End Function
由于您使用的是VB9,并且不能使用迭代器,因此可以使用一个非常简单明了的选项。
你只需要NuGet"Ix-Main"就可以获得Microsoft Reactive Framework团队的"交互式扩展"——一堆方便的IEnumerable<T>
运算符。
然后你可以试试这个代码:
Private Shared Function AllChildren2(json As JToken) As IEnumerable(Of JToken)
Return EnumerableEx.Expand(json.Children(), Function (c) c.Children())
End Function
创建一个C#类项目,向该项目添加json.net包/引用。添加以下类别
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
namespace NewtonExtensions
{
public static class Extensions
{
private static IEnumerable<JToken> AllChildren(JToken json)
{
foreach (var c in json.Children())
{
yield return c;
foreach (var cc in AllChildren(c))
{
yield return cc;
}
}
}
}
}
编译上述项目。在当前项目中,添加对上面项目的引用。在要使用扩展方法的地方,添加一个using语句。
这里的基本问题是,除非使用Visual Studio的早期Express版本,否则我们可以很容易地在不同语言之间共享代码。
EDIT这里与上面的扩展方法相同
使用Newtonsoft.Json.Linq;使用System.Collections.Generic;
namespace NewtonExtensions
{
public static class Extensions
{
public static IEnumerable<JToken> AllChildren(this JToken json)
{
foreach (var c in json.Children())
{
yield return c;
foreach (var cc in AllChildren(c))
{
yield return cc;
}
}
}
}
}
vb.net中的示例用法,其中我使用xml文本作为json字符串。你会像通常从文件等读取json。
Imports NewtonExtensions位于一个C#类项目中,该项目的命名空间为NewtonExtension。
在使用语言扩展方法之后,我展示了两种迭代数据的方法。
Imports NewtonExtensions
Imports Newtonsoft.Json.Linq
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) _
Handles Button1.Click
Dim jsonString As String =
<json>
{
"ADDRESS_MAP":{
"ADDRESS_LOCATION":{
"type":"separator",
"name":"Address",
"value":"",
"FieldID":40
},
"LOCATION":{
"type":"locations",
"name":"Location",
"keyword":{
"1":"LOCATION1"
},
"value":{
"1":"United States"
},
"FieldID":41
},
"FLOOR_NUMBER":{
"type":"number",
"name":"Floor Number",
"value":"0",
"FieldID":55
},
"self":{
"id":"2",
"name":"Address Map"
}
}
}
</json>.Value
Dim results As JObject = JObject.Parse(jsonString)
Console.WriteLine("Example 1")
For Each item As KeyValuePair(Of String, JToken) In results
Console.WriteLine(item.Key)
Dim test = item.Value.AllChildren
For Each subItem In test
Console.WriteLine(subItem)
Console.WriteLine()
Next
Next
Console.WriteLine(New String("-"c, 50))
Console.WriteLine("Example 2")
results.Cast(Of KeyValuePair(Of String, JToken)) _
.ToList.ForEach(
Sub(v)
Console.WriteLine(v.Key)
Console.WriteLine(v.Value)
End Sub)
End Sub
End Class