1

現在、次のコードを使用して、大きな Xml ファイルを XTable にロードしています。

Private Sub Button5_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
  TextBox4.Visible = False
  Dim asm = Assembly.GetExecutingAssembly()
  Dim var = asm.GetManifestResourceStream("WindowsApplication2.british-english-dictionary.xml")

  Dim rand = New Random()
  Dim myXml = XDocument.Load(var)
  var.Close()

  Dim lexemeList = myXml.Descendants("lexeme").ToList()
  Dim randomLexeme = lexemeList(rand.Next(0, lexemeList.Count - 1))

  TextBox2.Text = randomLexeme.Descendants("grapheme").Value
End Sub

ただし、xml は非常に長い (400,000 エントリ) ため、ボタンを押すのに少し時間がかかります。試して最小化するにDim myXml = XDocument.Load(var)は、ボタンを押すたびにではなく、XDocument への Xml ファイルの読み込みがプログラムを開くときにのみ行われるように、ボタンを押したくないです。

私はこれをやってみました:

Imports System.IO
Imports System
Imports System.Reflection
Imports System.Xml
Imports System.Security.Permissions

Public Class Form1    
  Public asm = Assembly.GetExecutingAssembly()
  Public var = asm.GetManifestResourceStream("WindowsApplication2.british-english-dictionary.xml")

  Public rand = New Random()
  Public myXml = XDocument.Load(var)

  Private Sub Button5_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    TextBox4.Visible = False

    Dim lexemeList = myXml.Descendants("lexeme").ToList()
    Dim randomLexeme = lexemeList(rand.Next(0, lexemeList.Count - 1))

    TextBox2.Text = randomLexeme.Descendants("grapheme").Value
  End Sub
End Class

しかし、ボタン クリック イベントが発生するとエラーが発生します。

タイプ 'd__a' のパブリック メンバー 'ToList' が見つかりません。

4

1 に答える 1

4

変数初期化子で重い作業を行うべきではありません。代わりに、Sub Newまたはを使用しますForm_Load。常に型を明示的に指定し、変数に意味のある名前を付けてください。変数を不必要に公開しないようにします。たとえば、asm内で非公開にすることができますSub New。例えば:

Public var As Stream
Public rand As Random
Public myXml As XDocument

Sub New()
  ' This call is required by the designer.
  InitializeComponent()

  ' Add any initialization after the InitializeComponent() call.
  Dim asm As Assembly = Assembly.GetExecutingAssembly()
  var = asm.GetManifestResourceStream("WindowsApplication2.british-english-dictionary.xml")
  rand = New Random()
  myXml = XDocument.Load(var)
End Sub

それから始めて、エラーがまだ続くかどうかを確認してください。

余談ですが、リソース ファイルをプロジェクト (*.resx) に追加してから、それに XML リソースを追加すると、コードをよりシンプルにすることができます。次に、呼び出すのと同じくらい簡単になります。

myXml = XDocument.Load(My.Resources.ResxName.british-english-dictionary.xml)

リソース名はコンパイル時にチェックされ、VS が配管を行うことに注意してください。

于 2013-02-16T13:43:19.470 に答える