0

このコミュニティで私が本当に大切にしていることの 1 つは、通常なら 20 行かかることを 2 行で行う方法を学べることです。その精神で、文字列解析を約 12 行から 3 行に減らすために最善を尽くしました。しかし、これが実際にどれほど混乱しているのかを見せたいと思っている人がいるように感じます。私自身の啓発のためだけに、次のことを行うためのよりクリーンな方法はありますか? すべてを 1 行で実行できますか?

string getThis = "<add key=\"messageFilter\" value=\"";
string subStr = strFile.Substring(strFile.IndexOf(getThis) + getThis.Length);
string[] igPhrases = subStr.Substring(0, subStr.IndexOf(";\"")).Split(';');

アップデート

迅速な対応に感謝します。本当に役立つ例と、最小限のスナークによる適切なアドバイス。:) 行数を減らすことは、クリーンでエレガントなことと同じではありません。行数を減らすと、実際にはコードが悪化する可能性があります。

質問を言い換えさせてください。

次の行を含む XML ドキュメントがあります: <add key="messageFilter" value="Out of Office AutoReply;Automatic reply;"/>. このドキュメントは、件名にこれらのフレーズが含まれるメールからはチケットを作成しないよう、自動チケット発行システムに指示しています。そうしないと、無限ループになります。

私は、既に含まれているフレーズを一覧表示し、ユーザーが新しいフレーズを追加できるようにする小さなプログラムに取り組んでいます。新しい自動返信メッセージがシステムをループし始めていることに気付いた場合、そのメッセージの言語をフィルターに追加できるようにする必要があります。

私は XML をあまり扱っていません。Sperske のソリューションは気に入っていますが、動的にする方法がわかりません。つまり、コードに値を入れることができません。キー「messageFilter」を見つけて、そのキーに関連付けられているすべての値を取得する必要があります。

私がやったことはうまくいきますが、少し面倒です。キー値を取得するより簡単な方法はありますか? そして、新しいものを追加するには?

4

3 に答える 3

5

わずかに異なる 1 つのライナー (読みやすくするために分割):

System.Xml.Linq.XDocument
  .Parse("<add key='messageFilter' value='AttrValue'/>")
  .Root
  .Attribute("value")
  .Value

出力:

AttrValue

更新された質問に対処するには、すべての<add>ノードを辞書に変換できます (Pako の優れた回答から借りて、少し長い文字列を使用します)。

var keys = System.Xml.Linq.XDocument
  .Parse("<keys><add key='messageFilter' value='AttrValue'/><add key='userFilter' value='AttrValueUser'/></keys>")
  .Descendants("add")
  .ToDictionary(r => r.Attribute("key").Value, r => r.Attribute("value").Value);

これにより、次のようにキーにアクセスできます。

keys["messageFilter"] == "AttrValue"
keys["userFilter"] == "AttrValueUser"
于 2013-04-11T20:37:56.027 に答える
1

醜い1行:

string[] igPhrases = strFile.Substring(strFile.IndexOf(getThis) + ("<add key=\"messageFilter\" value=\"").Length).Substring(0, strFile.Substring(strFile.IndexOf("<add key=\"messageFilter\" value=\"") + ("<add key=\"messageFilter\" value=\"").Length).IndexOf(";\"")).Split(';');
于 2013-04-11T20:32:57.743 に答える