gpt4 book ai didi

c# - 尝试获取带有链接到代码和名称的枚举值的 NetSuite 国家/地区列表

转载 作者:太空宇宙 更新时间:2023-11-03 23:15:43 24 4
gpt4 key购买 nike

我正在使用 C# 实现与 NetSuite 的集成。在外部系统中,我需要填充一个与 NetSuite 的国家/地区列表相匹配的国家/地区列表。

NetSuite Web Service 提供枚举调用国家

public enum Country {
_afghanistan,
_alandIslands,
_albania,
_algeria,
...

您还可以从网络服务中获取国家名称和代码列表(虽然不是那么直接)。 (参见:http://suiteweekly.com/2015/07/netsuite-get-all-country-list/)

这使您可以访问这样的值:

  • 阿富汗,AF
  • 奥兰群岛,AX
  • 阿尔巴尼亚,阿拉巴马州
  • Algolia ,DZ
  • 美属萨摩亚,AS
  • ...

但是,如您所见,无法将两者联系在一起。 (我尝试通过索引进行匹配,但没有用,而且听起来很吓人)

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com