- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 C# 实现与 NetSuite 的集成。在外部系统中,我需要填充一个与 NetSuite 的国家/地区列表相匹配的国家/地区列表。
NetSuite Web Service 提供枚举调用国家
public enum Country {
_afghanistan,
_alandIslands,
_albania,
_algeria,
...
您还可以从网络服务中获取国家名称和代码列表(虽然不是那么直接)。 (参见:http://suiteweekly.com/2015/07/netsuite-get-all-country-list/)
这使您可以访问这样的值:
但是,如您所见,无法将两者联系在一起。 (我尝试通过索引进行匹配,但没有用,而且听起来很吓人)
NetSuite 的“帮助”文件有一个列表。但这是静态的,我真的想要一个随着 NetSuites 更新而更新的动态解决方案,因为我们知道国家会发生变化——即使不是经常发生变化。
Screenshot of Country Enumerations from NetSuite help docs
我在网上找到的唯一解决方案是提供映射两组数据的静态数据的人。 (例如 suiteweekly.com/2015/07/netsuite-complete-country-list-in-netsuite/)
我不能(不想)相信这是唯一的解决方案。
有没有其他人对此有更好的解决方案?
NetSuite,如果你正在阅读,伙计们,来吧,让程序员休息一下。
最佳答案
我想出的最佳解决方案是利用国家名称和枚举键之间的明显关系在两者之间建立联系。我相信其他人可以改进这个解决方案,但我真正希望看到的解决方案不是像这样依赖于明显模式的 hack,而是基于显式连接的解决方案。或者更好的是,NetSuite 应该只在一个地方一起提供数据。
例如,您可以在此处看到明显的关系:
_alandIslands -> 奥兰群岛
只需一点代码,我就可以尝试建立匹配。
我首先将枚举键放入一个数组中。我创建了一个 NetSuiteCountry 类型的对象列表来保存我的结果。
var countryEnumKeys = Enum.GetNames(typeof(Country));
var countries = new List<NetSuiteCountry>();
然后我循环遍历我使用上面引用的代码(此处未显示)获得的国家/地区名称和代码列表。
然后,对于每个国家/地区名称,我使用 Regex.Replace 去除国家/地区名称中的所有非单词字符,添加下划线 (_),然后将字符串转换为小写。最后,我尝试找到 Enumeration Key(也转换为小写)和创建的匹配器字符串之间的匹配项。如果找到匹配项,我会将所有数据保存在国家/地区列表中。
更新:根据评论,我添加了额外的代码/hack 来尝试在没有硬编码异常的情况下处理异常。希望这些更新也能捕捉到国家列表的任何 future 更新,但没有 promise 。在撰写本文时,它能够处理所有已知的异常。就我而言,我需要忽略已弃用的国家/地区,因此不包括在内。
foreach (RecordRef baseRef in baseRefList)
{
var name = baseRef.name;
//Skip Deprecated countries
if (name.EndsWith("(Deprecated)")) continue;
//Use the name to try to find and enumkey match and only add a country if found.
var enumMatcher = $"_{Regex.Replace(name, @"\W", "").ToLower()}";
//Compares Ignoring Case and Diacritic characters
var enumMatch = CountryEnumKeys.FirstOrDefault(e => string.Compare(e, enumMatcher, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase) == 0);
//Then try by Enum starts with Name but only one.
if (enumMatch == null)
{
var matches = CountryEnumKeys.Where(e => e.ToLower().StartsWith(enumMatcher));
if (matches.Count() == 1)
{
Debug.Write($"- Country Match Hack 1 : ");
enumMatch = matches.First();
}
}
//Then try by Name starts with Enum but only one.
if (enumMatch == null)
{
var matches = CountryEnumKeys.Where(e => enumMatcher.StartsWith(e.ToLower()));
if (matches.Count() == 1)
{
Debug.Write($"- Country Match Hack 2 : ");
enumMatch = matches.First();
}
}
//Finally try by first half Enum and Name match but again only one.
if (enumMatch == null)
{
var matches = CountryEnumKeys.Where(e => e.ToLower().StartsWith(enumMatcher.Substring(0, (enumMatcher.Length/2))));
if (matches.Count() == 1)
{
Debug.Write($"- Country Match Hack 3 : ");
enumMatch = matches.First();
}
}
if (enumMatch != null)
{
var enumIndex = Array.IndexOf(CountryEnumKeys, enumMatch);
if (enumIndex >= 0)
{
var country = (Country) enumIndex;
var nsCountry = new NetSuiteCountry
{
Name = baseRef.name,
Code = baseRef.internalId,
EnumKey = country.ToString(),
Country = country
};
Debug.WriteLine($"[{nsCountry.Name}] as [{nsCountry.EnumKey}]");
countries.Add(nsCountry);
}
}
else
{
Debug.WriteLine($"Could not find Country match for: [{name}] as [{enumMatcher}]");
}
}
这是我的 NetSuiteCountry 类:
public class NetSuiteCountry
{
public string Name { get; set; }
public string Code { get; set; }
public string EnumKey { get; set; }
public Country Country { get; set; }
}
关于c# - 尝试获取带有链接到代码和名称的枚举值的 NetSuite 国家/地区列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37318296/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!