有一种更好的方法从地理编码谷歌地图获取类型?

时间:2015-06-04 18:59:41

标签: c# google-maps

使用c#我需要从谷歌地图获取每种地址类型,我使用的是foreach和asign值。有比下一个代码更好的方法吗?:

string street_number;
                string route;
                string locality;
                string administrative_area_level_3;
                string administrative_area_level_2;
                string administrative_area_level_1;
                string country;

                foreach (var addressComp in result.results[0].address_components)
                {
                    var addr = addressComp;

                    if (addr.types[0] == "street_number")
                        street_number = addr.long_name;
                    else if (addr.types[0] == "route")
                        route = addr.long_name;
                    else if (addr.types[0] == "locality")
                        locality = addr.long_name;
                    else if (addr.types[0] == "administrative_area_level_3")
                        administrative_area_level_3 = addr.long_name;
                    else if (addr.types[0] == "administrative_area_level_2")
                        administrative_area_level_2 = addr.long_name;
                    else if (addr.types[0] == "administrative_area_level_1")
                        administrative_area_level_1 = addr.long_name;
                    else if (addr.types[0] == "country")
                        country = addr.long_name;
                }

2 个答案:

答案 0 :(得分:1)

对我来说,一个更易读的代码就是这样使用Linq

{{1}}

可能效率较低,但对我来说可读性很高。

答案 1 :(得分:1)

改为使用switch语句:

switch(addr.types[0]) {
    case "street_number":
       street_number = addr.long_name;
       break;
    case "route":
       route = addr.long_name;
       break;
    case "locality":
       locality = addr.long_name;
       break;
    case "administrative_area_level_3":
       administrative_area_level_3 = addr.long_name;
       break;
    case "administrative_area_level_2":
       administrative_area_level_2 = addr.long_name;
       break;
    case "administrative_area_level_1":
       administrative_area_level_1 = addr.long_name;
       break;
    case "country":
       country = addr.long_name;
       break;
    default:
       // Error: addr.long_name does not match a case.
       break;
}

...或@Habib提到使用Dictionary

Dictionary<string, string> geo_data = new Dictionary<string, string>();

foreach (var addressComp in result.results[0].address_components)
{
    geo_data[addr.types[0]] = addr.long_name;
}

通过使用字典,代码占用的行数明显减少,但可读性也降低,也许更复杂。可能会保存您在应用程序中未使用的结果中的数据,因此我会在您的情况下使用switch。