如何在C#中重新实现PHP7.3数组排序方法?
我面对的是一个第三方API端点,它是用PHP编写的,在PHP7.3下运行,它对请求参数进行排序,并计算其SHA签名(不包括签名参数本身),该签名必须与我在请求参数中提供的签名相匹配 下面是排序的PHP示例代码:如何在C#中重新实现PHP7.3数组排序方法?,c#,sorting,C#,Sorting,我面对的是一个第三方API端点,它是用PHP编写的,在PHP7.3下运行,它对请求参数进行排序,并计算其SHA签名(不包括签名参数本身),该签名必须与我在请求参数中提供的签名相匹配 下面是排序的PHP示例代码: $sort_case_sensitive = true; $keys = array_keys($parameters); $keys_to_sort = array(); foreach ($keys as $key) { $keys_to_sort[] = $sort_cas
$sort_case_sensitive = true;
$keys = array_keys($parameters);
$keys_to_sort = array();
foreach ($keys as $key)
{
$keys_to_sort[] = $sort_case_sensitive
? $key
: strtoupper( $key );
}
array_multisort( $keys_to_sort, SORT_STRING, $keys );
此PHP函数的结果如下所示:
address_street
address_street2
address_street_name
address_street_number
但是,我的客户机是用C#编写的,排序(默认算法)输出如下所示:
address_street
address_street_name
address_street_number
address_street2
如何在C#中重新实现PHP的排序算法?我找不到PHP用于排序的字母表的参考。我可以看到对PHPs源代码中字符串排序的
zend_binary\u strcasecmp\u l
调用,但我找不到zend_binary\u strcasecmp\u l
的定义,只有标题。尝试使用顺序比较器:
var l = new List<string>();
l.Add("address_street_name");
l.Add("address_street_number");
l.Add("address_street");
l.Add("address_street2");
l.Sort(StringComparer.Ordinal);
foreach(string s in l) Console.WriteLine(s);
var l=新列表();
l、 添加(“地址、街道、名称”);
l、 添加(“地址、街道、编号”);
l、 加上(“地址街”);
l、 添加(“地址_街2”);
l、 排序(StringComparer.Ordinal);
foreach(l中的字符串s)控制台。WriteLine(s);
尝试使用顺序比较器:
var l = new List<string>();
l.Add("address_street_name");
l.Add("address_street_number");
l.Add("address_street");
l.Add("address_street2");
l.Sort(StringComparer.Ordinal);
foreach(string s in l) Console.WriteLine(s);
var l=新列表();
l、 添加(“地址、街道、名称”);
l、 添加(“地址、街道、编号”);
l、 加上(“地址街”);
l、 添加(“地址_街2”);
l、 排序(StringComparer.Ordinal);
foreach(l中的字符串s)控制台。WriteLine(s);
Zend现在显然是开源的。也许您可以在该项目的源代码中找到线索(与PHP相反)。不管怎样,你确定你的bug不在C#中吗?您还没有向我们展示如何实现它。您所引用的Zend函数(从其名称来看)似乎与进行案例比较有关……但是您的示例结果都是小写的,因此案例比较不应该影响它。似乎更多的是考虑数字是在数字字符之前还是之后?你有一个排序大写的例子吗?给定
var q=new string[]{“address_street”、“address_street2”、“address_street_name”、“address_street_number”}
,两者都Array.Sort(q,StringComparer.OrdinalIgnoreCase)
和数组.Sort(q,StringComparer.Ordinal)
给出显示的结果。@AndrewMorton:$sort\u区分大小写
对于我使用的API版本总是true
。所以在我的项目中没有大写字母排序。当我手动“修复”查询(手动重新排序)时,我得到了PHP正在寻找的签名。Zend现在显然是,它说它是开源的。也许您可以在该项目的源代码中找到线索(与PHP相反)。不管怎样,你确定你的bug不在C#中吗?您还没有向我们展示如何实现它。您所引用的Zend函数(从其名称来看)似乎与进行案例比较有关……但是您的示例结果都是小写的,因此案例比较不应该影响它。似乎更多的是考虑数字是在数字字符之前还是之后?你有一个排序大写的例子吗?给定var q=new string[]{“address_street”、“address_street2”、“address_street_name”、“address_street_number”}
,两者都Array.Sort(q,StringComparer.OrdinalIgnoreCase)
和数组.Sort(q,StringComparer.Ordinal)
给出显示的结果。@AndrewMorton:$sort\u区分大小写
对于我使用的API版本总是true
。所以在我的项目中没有大写字母排序。当我手动“修复”查询(手动重新排序)时,我得到了PHP正在寻找的签名。使用l.Sort(StringComparer.Ordinal)代码>,结果与预期一致。谢谢。我使用了l.Sort()
。使用l.Sort(StringComparer.Ordinal)代码>,结果与预期一致。非常感谢。