2

チャットプログラムを作っています。私はニックネーム機能を実行しており、プログラムにnick設定ファイルの要素の値を取得させたいと考えています。ただし、プログラムを実行すると、値ではなく文字列の型が返されます。出力はYour current nickname is System.Linq.Enumerable+WhereSelectEnumerableIterator2[System.Xml.Linq.XElement,<>f__AnonymousType01[System.String]]、次の値であると想定される場合です。

<ilanChat>
    <settings>
        <nick>User</nick>
    </settings>
</ilanChat>

コードは次のとおりです。

public string GetNick()
{
    string temp = "hello";
    ClientClass prog = new ClientClass();
    XDocument doc = XDocument.Load(prog.settingsFile);
    var data = from item in doc.Descendants("settings")
               select new
               {
                   nick = item.Element("nick").Value
               };
    foreach (var i in data)
    {
        temp = data.ToString();
        temp = temp.Replace("{ name = ", "");
        temp = temp.Replace("}", "").Trim();
    }
    return temp;
}

しかし、それは前述の問題を返します。tempまた、リストに追加してから[0]値を返そうとしましたが、まだ問題があります。

4

3 に答える 3

4

単一の文字列を見つけようとしていますが、それを匿名オブジェクトでラップしているだけでなく、1 つのアイテムだけでなく、0 から多数のアイテムのシーケンスがあるという事実もあります。

まず、匿名オブジェクトを使用しないでください。文字列値を選択するだけです。

次に、シーケンスではなく 1 つのアイテムのみが必要な場合は、必要なアイテムを決定する必要があります。最初のアイテムが欲しいですか?FirstOrDefault次に、その 1 つのアイテムを取得するなどのメソッドを使用します。

var data = (from item in doc.Descendants("settings")
            select item.Element("nick").Value)
            .FirstOrDefault();
return data;
于 2013-11-08T19:27:30.963 に答える
2

ループiではなく参照する必要があります。dataまた、匿名オブジェクト.ToStringを変換して解析するのではなく、匿名プロパティnickを直接参照するだけです。

foreach (var i in data)
{
    temp = i.nick;
}
return temp;

常に単一の値のみを使用する場合は、ループも必要ありません。LINQ で結果を直接取得するだけです。

return data.Single().nick;
于 2013-11-08T19:28:20.700 に答える