1

私はxmlを使用してデータを解析する方法に取り組んでいます。

与えられたファイルには、次のような行が含まれています。

George | Washington | Carver

または他の誰かが私にこのようなものを送ることができます

Carver | Washington | George

等々...

形式が何であれ、ファイルを送ってくれる人は誰でも、ファイルの解析方法に関するルールも送ってくれます。最初の例では、First Name | ミドルネーム | 苗字。2 番目の例では、姓 | です。ミドルネーム | ファーストネーム

それぞれの可能性について特別なケースを記述する代わりに、メタ データを記述する XML ファイルを作成しました。

<file>
    <first>0</first>
    <middle>1</middle>
    <last>2</last>
</file>

たとえば、この場合。このタグは、名が 0 番目の位置にあることを示すことにfirst対応しています。0

直感的に、キーをタグに設定し、値をテキストに設定して辞書を作成することを考えました。そんな...

    public static IDictionary<string, string> GetLookupTable(string xmlContents)
{
    XElement xmlElement = XElement.Parse(xmlContents);

    IDictionary<string, string> table = new Dictionary<string, string>();

    foreach (var element in xmlElement.Elements())
    {
        table.Add(element.Name.LocalName, element.Value);
    }

    return table;
}

しかし、私は .NET の実装にあまり詳しくないので、いくつか疑問に思ったことがあります。

  1. XElement辞書を作成するのではなく、トラバースする方がよいでしょうか? XElementトラバーサルは、必要なものを取得するために順序付けられていないツリーのトラバーサルを伴う可能性があると信じているため、これは良い考えではないと思います。各プロパティ (私は 3 つ以上あります) に対してこれを行うのは非常に非効率的です。私はここで推測しているだけです...

  2. dictionary一定時間からの取得ですか?HashMapJavaでは一定の get があることを私は知っています。C# の場合も同様である場合は、1 回トラバースするだけで、一定の時間内に必要なものを取得できるため、これはより良いルートのように思えます。

4

1 に答える 1

3
  1. なぜそれを測定しないのですか?最初にコードを最も単純にすることは何でもして、それを測定します。コードの残りの部分については、辞書の方が単純であると予想されるので、それを使用します。ただし、各要素が整数になる場合は、Dictionary<string, int>.

  2. はい、Dictionaryハッシュテーブルなので、恐ろしい衝突がないと仮定すると、O(1) ルックアップがあります。

私はLINQを使用しToDictionaryます:

public static IDictionary<string, int> GetLookupTable(string xmlContents)
{
    return XElement.Parse(xmlContents)
                   .Elements()
                   .ToDictionary(x => x.Name.LocalName,
                                 x => (int) x);
}

(明らかに、これは各要素をintではなく に変換してstringいますが、本当に が必要な場合は簡単に変更できますIDictionary<string, string>。)

于 2013-06-13T20:22:49.807 に答える