Yield in Vb.net 9



我想在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

相关内容

  • 没有找到相关文章

最新更新