在.NET 2.0中替换VAR数据类型

时间:2012-08-11 11:48:16

标签: linq google-maps var

我使用的是.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;
}

但是我收到了一个错误:

  

'string'不包含'Descendants'的定义

请帮我在此处替换VAR

4 个答案:

答案 0 :(得分:4)

要替换var,请研究方法的实际返回类型并将其更改为该方法。例如,可以在MSDN here上找到XDocument.Parse。在文档中,它指出“从字符串创建新的XDocument”,因此,返回类型必须是XDocument。如果你深入研究其中一个方法重载(like this one),你会看到实际方法的签名,它确认它确实返回了一个XDocument。

此外,Visual Studio具有智能感知功能,因此如果您将鼠标悬停在某些内容上,通常可以获得有关它的详细信息。尝试键入System.Xml.Linq.XDocument.Parse(,当您键入第一个paren时,您应该在Visual Studio中看到一个弹出窗口,告诉您正在使用的方法的返回类型。如果intellisense不起作用,请检查以确保您具有对DLL的引用。

另请注意,Visual Studio具有所谓的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是针对EULA的,因此该解决方案在.NET 2.0中不起作用,因此您可能必须将XDocument更改为XmlDocument并找出如何集成它具有谷歌的回报价值。我相信它有一个Load方法,或者LoadXml方法,不记得哪一个做了哪个。

答案 1 :(得分:0)

var本身并不是一种数据类型,只是从等于运算符的另一端获取数据类型。 read more about it here

因此,如果您不能使用var,则用字符串替换每个var将无法帮助您使用正确的数据类型而不是var。 您的情况中出现错误的原因是因为您在替换var时考虑此行string doc = System.Xml.Linq.XDocument.Parse(result).ToString();,您应该使用XDocument,而是使用string来容纳使用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;
}


答案 2 :(得分:0)

var关键字用于隐式输入变量。你让编译器推断变量的类型。但是在幕后,一旦编译发生,变量仍然会被分配特定的类型。

你做错了就是在.ToString()上致电XDocument。现在你只有一个大字符串,你试图将它视为仍然是XDocument

试试这个。

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

修改

最后在一台带有Visual Studio的计算机前面。你还有一些问题。

以下内容将在.NET 3.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;

顺便说一句,我实际上并没有看到你编写的很多代码如何在.NET 2.0中运行。直到.NET 3.5才引入System.Xml.LinqSystem.Linq命名空间。如果您真的使用的是.NET 2.0,那么您可能需要参考this thread来解决您正在使用的框架版本。

答案 3 :(得分:0)

好的,现在我尝试了所有可能的 .NET 2.0 ,我想出了这个解决方案,我知道 非常低级别的编码 但是 唯一可能的解决方案是2.0 ,这个适用于.NET 2.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;
}