0

私は .NET 2.0 を使用しています。ここに VAR データ型を実装する必要があります。

var doc = XDocument.Parse(result);
var sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();
if (sw != null)
{
   var lat = (double)sw.Element("lat");
   var lng = (double)sw.Element("lng");
   // do stuff
}

代わりに STRING を使用しました

public string getLatLang(string address)
{
    string latlang = "";
    string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false";
    System.Net.WebClient client = new System.Net.WebClient();
    string result = client.DownloadString(url);
    string doc = System.Xml.Linq.XDocument.Parse(result).ToString();
    string sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();
    if (sw != null)
    {
        string lat = (double)sw.Element("lat");
        string lng = (double)sw.Element("lng");
        latlang = lat + "," + lang;
        // do stuff
    }
    return latlang;
}

しかし、私はエラーが発生します:

「文字列」には「子孫」の定義が含まれていません

ここで交換するのを手伝ってくださいVAR

4

4 に答える 4

4

varを置き換えるには、メソッドの実際の戻りタイプを調べて、それに変更します。たとえば、XDocument.ParseはMSDNのここにあります。ドキュメントには「文字列から新しいXDocumentを作成する」と記載されているため、戻り値のタイプはXDocumentである必要があります。また、メソッドのオーバーロードの1つ(このような)にドリルダウンすると、実際にXDocumentが返されることを確認する実際のメソッドのシグネチャが表示されます。

また、Visual Studioにはインテリセンスがあるため、何かにカーソルを合わせると、通常、その詳細を取得できます。入力してみてくださいSystem.Xml.Linq.XDocument.Parse(。最初の親を入力すると、使用しているメソッドの戻り値の種類を示すポップアップがVisualStudioに表示されます。インテリセンスが機能しない場合は、DLLへの参照があることを確認してください。

また、VisualStudioにはとして知られているものがあることに注意してくださいObject Explorer。これにより、戻り型を含む、操作している各オブジェクトのメソッドシグネチャを確認できます。オブジェクトまたはメソッドを右クリックして、[定義に移動]を選択するだけです。うまくいけば、使用しているVisual Studioのバージョンにこれが含まれている場合は、アップグレードを検討してください。非常に便利です。

public string getLatLang(string address) 
{ 
    string latlang = ""; 
    string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false"; 
    System.Net.WebClient client = new System.Net.WebClient(); 
    string result = client.DownloadString(url); 
    XDocument doc = System.Xml.Linq.XDocument.Parse(result); 
    XElement sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault(); 
    if (sw != null) 
    { 
        string lat = sw.Element("lat").Value;  
        string lng = sw.Element("lng").Value;  
        latlang = String.Format("{0},{1}", lat, lng); 
        // do stuff 
    } 
    return latlang; 
} 

編集:このソリューションは、LINQとSystem.Coreの再配布によるハッキングなしでは.NET 2.0で機能しないことに注意してください。したがって、XDocumentをXmlDocumentに変更し、Googleの戻り値。LoadメソッドまたはLoadXmlメソッドがあり、どちらがどちらを実行するかを思い出せないと思います。

于 2012-08-11T12:06:05.240 に答える
0

varキーワードは、変数を暗黙的に型指定するために使用されます。コンパイラに変数のタイプを推測させます。しかし、内部では、コンパイルが行われると、変数には引き続き特定のタイプが割り当てられます。

あなたが間違ったことは.ToString()あなたのを呼び出すことですXDocument。これで、大きな文字列が1つだけあり、それをまだのように処理しようとしていますXDocument

代わりにこれを試してください。

XDocument doc = System.Xml.Linq.XDocument.Parse(result);
XElement = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();

編集

ついに、VisualStudioを搭載したコンピューターの前に立ちました。さらにいくつか問題があります。

以下は.NET3.5以降でコンパイルされます。

public string getLatLang(string address)
{
    string latlang = "";    
    string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false";
    System.Net.WebClient client = new System.Net.WebClient();
    string result = client.DownloadString(url);
    XDocument doc = System.Xml.Linq.XDocument.Parse(result);
    XElement sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();

    if (sw != null)
    {
        string lat = sw.Element("lat").ToString();
        string lng = sw.Element("lng").ToString();
        latlang = lat + "," + lng;
        // do stuff
    }
    return latlang;
}

double(後で明示的に値をキャストし、それらのタイプをとして定義していることに注意してくださいstring)。

コメントで言及したエラーについては、よくわかりません...Elements<T>(IEnumerable<T>, XName)メンバーはSystem.Xml.LinqMSDN)の拡張機能クラスに含まれているため、機能するはずです。System.Linqディレクティブが他のusingディレクティブにも含まれていることを確認してください。

using System.Linq;

余談ですが、実際には、作成したコードの多くが.NET2.0でどのように機能するかはわかりません。System.Xml.Linqおよび名前空間は、 System.Linq.NET3.5まで導入されませんでした。実際に.NET2.0を使用している場合は、使用しているフレームワークバージョンの回避策として、このスレッドを参照することをお勧めします。

于 2012-08-11T12:06:42.823 に答える
0

さて、.NET 2.0で可能なすべてのことを試しました。非常に低レベルのコーディングであることがわかっているこのソリューションを思いつきましたが、 2.0で可能な唯一のソリューションであり、これは.NET2.0で優れた機能を発揮します。

public string getLatLang(string address)
{
    string latlang = "";
    string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false";
    System.Net.WebClient client = new System.Net.WebClient();
    string result = client.DownloadString(url);

    int firstlat = result.IndexOf("<lat>");
    int lastlat = result.IndexOf("</lat>");

    int firstlng = result.IndexOf("<lng>");
    int lastlng = result.IndexOf("</lng>");

    string _latitude = result.Substring(firstlat+5, (lastlat-5) - firstlat);
    string _longitude = result.Substring(firstlng+5, (lastlng-5) - firstlng);

    latlang = _latitude + "," + _longitude;
    return latlang;
}
于 2012-08-11T14:37:03.473 に答える
0

var 自体はデータ型ではなく、等値演算子の反対側からデータ型を取得するだけです。詳細はこちら

したがって、すべての変数を文字列に置き換えてもvar、a を使用できない場合は代わりに正しいデータ型を使用する必要がありますvar
あなたの場合のエラーは、この行でstring doc = System.Xml.Linq.XDocument.Parse(result).ToString();var を置き換えるときに使用する必要があると思いXDocumentますが、代わりに関数をstring使用してエラーに対応するために a を使用したためToString()です。
編集: - コメントの後

public string getLatLang(string address)
{
    string latlang = "";
    string url = "http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false";
    System.Net.WebClient client = new System.Net.WebClient();
    string result = client.DownloadString(url);
    XDocument doc = System.Xml.Linq.XDocument.Parse(result);
    XElement sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();
    if (sw != null)
    {
        string lat = (double)sw.Element("lat").Value;
        string lng = (double)sw.Element("lng").Value;
        latlang = lat + "," + lang;
        // do stuff
    }
    return latlang;
}


于 2012-08-11T11:59:37.620 に答える