【问题标题】:Replacing VAR datatype in .NET 2.0在 .NET 2.0 中替换 VAR 数据类型
【发布时间】:2012-08-08 12:13:51
【问题描述】:

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

【问题讨论】:

  • var 本身不是数据类型,而是表示编译器推断的类型。并非所有var 变量都具有相同的类型。从顶部开始,一直到底部找出每种类型。
  • 我试图在后面的 C# 代码中使用谷歌地图获取纬度和经度,这行给我带来了问题:string sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault ();你们能帮我吗?我了解并非所有 var 变量都具有相同的类型,但 wat 是 .NET 2.0 的可能解决方案
  • 另外,如果你有 Resharper,你可以这样做:stackoverflow.com/questions/289743/…

标签: linq google-maps var


【解决方案1】:

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

因此,如果您不能使用var,则必须使用正确的数据类型而不是var,用字符串替换每个var。
你的情况下的错误是源于你我认为在这一行 string doc = System.Xml.Linq.XDocument.Parse(result).ToString(); 替换 var 时你应该使用 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;
}


【讨论】:

  • 是的,我知道这里的代码 sn-p 不正确,我这样做是为了让读者理解我的目标。我需要帮助以字符串格式返回 latlang = lat + "," + lang。谢谢
  • 我试过但显示错误:'System.Collections.Generic.IEnumerable' 不包含'Elements'的定义
【解决方案2】:

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

此外,Visual Studio 具有智能感知功能,因此如果您将鼠标悬停在某物上,您通常可以获得有关它的详细信息。尝试输入System.Xml.Linq.XDocument.Parse(,当您输入第一个括号时,您应该会在 Visual Studio 中看到一个弹出窗口,告诉您正在使用的方法的返回类型是什么。如果智能感知不起作用,请检查以确保您有对 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方法,不记得哪个做哪个。

【讨论】:

    【解决方案3】:

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

    您做错了什么是在您的XDocument 上调用.ToString()。现在你只有一个大字符串,你试图把它当作仍然是一个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.Linq (MSDN) 的扩展类中,所以它应该可以工作。确保您还包含 System.Linq 指令和其他 using 指令:

    using System.Linq;

    顺便说一句,我实际上看不到您编写的大量代码在 .NET 2.0 中可以运行。 System.Xml.LinqSystem.Linq 命名空间直到 .NET 3.5 才引入。如果您真的在使用 .NET 2.0,那么您可能需要参考 this thread 以了解您正在使用的框架版本的解决方法。

    【讨论】:

    • 我试过了,但错误:'System.Collections.Generic.IEnumerable' 不包含'Elements'的定义
    【解决方案4】:

    好的,现在我用 .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;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-04
      • 2012-01-14
      • 2018-10-30
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多