字符串比较解决方法
字符串比较
为什么s1="zhangsaN"<s2="zhanGsan"而s1="zhangsaP"<s2="zhanGsan“????
------解决思路----------------------
首先C#不能直接进行字符串比较
其次如果排序的话,你的两个字符串都是s2排在s1前面,因为G的ASCII码小于g的ASCII码
------解决思路----------------------
不管什么编码,前128位都是ASCII
------解决思路----------------------
"A"小于"a",因为ASCII码中A是65,a是97
------解决思路----------------------
奥特曼了,这东西还真是这样……
------解决思路----------------------
序号排序规则才是按ASCII比较……默认是CurrentCulture
------解决思路----------------------
https://msdn.microsoft.com/zh-cn/library/system.stringcomparison%28VS.80%29.aspx
碉堡的区域敏感排序规则
------解决思路----------------------
https://msdn.microsoft.com/zh-cn/library/system.globalization.cultureinfo%28v=vs.80%29.aspx
看完还是不知道为啥会这样……碉堡了
总不可能去研究RFC,ISO标准吧……
------解决思路----------------------
------解决思路----------------------
确实是和语言设置相关的
看源代码就知道了
http://referencesource.microsoft.com/#mscorlib/system/globalization/compareinfo.cs,0cba7af692b66098
------解决思路----------------------
如何比较字符串
// 查询数据库信息
/// <returns>方法返回DataTable对象</returns>
private DataTable GetStudent()
{
string P_Str_ConnectionStr = string.Format(//创建数据库连接字符串
@"server=WIN-GI7E47AND9R\LS;database=db_TomeTwo;uid=sa;pwd=");
string P_Str_SqlStr = string.Format(//创建SQL查询字符串
@"SELECT 学生姓名,CASE WHEN 所在学院 = '计算机学院'
THEN '计算机学院学生' ELSE '否' END AS 是否为计算机学院学生 FROM tb_Student");
SqlDataAdapter P_SqlDataAdapter = new SqlDataAdapter(//创建数据适配器
P_Str_SqlStr, P_Str_ConnectionStr);
DataTable P_dt = new DataTable();//创建数据表
P_SqlDataAdapter.Fill(P_dt);//填充数据表
return P_dt;//返回数据表
}//codego.net/1/4/139/
// 查询数据库信息
// <returns>方法返回DataTable对象</returns>
private DataTable GetMessage()
{
string P_Str_ConnectionStr = string.Format(//创建数据库连接字符串
@"server=WIN-GI7E47AND9R\LS;database=db_TomeTwo;uid=sa;pwd=");
string P_Str_SqlStr = string.Format(//创建SQL查询字符串
"SELECT 学生姓名,所在学院 FROM tb_Student");
SqlDataAdapter P_SqlDataAdapter = new SqlDataAdapter(//创建数据适配器
P_Str_SqlStr, P_Str_ConnectionStr);
DataTable P_dt = new DataTable();//创建数据表
P_SqlDataAdapter.Fill(P_dt);//填充数据表
return P_dt;//返回数据表
}
为什么s1="zhangsaN"<s2="zhanGsan"而s1="zhangsaP"<s2="zhanGsan“????
------解决思路----------------------
首先C#不能直接进行字符串比较
其次如果排序的话,你的两个字符串都是s2排在s1前面,因为G的ASCII码小于g的ASCII码
------解决思路----------------------
不管什么编码,前128位都是ASCII
------解决思路----------------------
"A"小于"a",因为ASCII码中A是65,a是97
------解决思路----------------------
static void OrderString()
{
var arr = new List<string>{ "zhangsaN", "zhanGsan", "zhangsaP", "zhanGsan", "A", "a" };
arr.OrderBy(x => x).ToList().ForEach(x =>
{
Console.WriteLine(x);
});
}
奥特曼了,这东西还真是这样……
------解决思路----------------------
public enum StringComparison
{
// 摘要:
// 使用区域敏感排序规则和当前区域比较字符串。
CurrentCulture = 0,
//
// 摘要:
// 使用区域敏感排序规则、当前区域来比较字符串,同时忽略被比较字符串的大小写。
CurrentCultureIgnoreCase = 1,
//
// 摘要:
// 使用区域敏感排序规则和固定区域比较字符串。
InvariantCulture = 2,
//
// 摘要:
// 使用区域敏感排序规则、固定区域来比较字符串,同时忽略被比较字符串的大小写。
InvariantCultureIgnoreCase = 3,
//
// 摘要:
// 使用序号排序规则比较字符串。
Ordinal = 4,
//
// 摘要:
// 使用序号排序规则并忽略被比较字符串的大小写,对字符串进行比较。
OrdinalIgnoreCase = 5,
}
序号排序规则才是按ASCII比较……默认是CurrentCulture
------解决思路----------------------
https://msdn.microsoft.com/zh-cn/library/system.stringcomparison%28VS.80%29.aspx
碉堡的区域敏感排序规则
------解决思路----------------------
https://msdn.microsoft.com/zh-cn/library/system.globalization.cultureinfo%28v=vs.80%29.aspx
看完还是不知道为啥会这样……碉堡了
总不可能去研究RFC,ISO标准吧……
------解决思路----------------------
Console.WriteLine(string.Compare("zhangsaN", "zhanGsan", StringComparison.CurrentCulture));//-1
Console.WriteLine(string.Compare("zhangsaP", "zhanGsan", StringComparison.CurrentCulture));//1
------解决思路----------------------
确实是和语言设置相关的
看源代码就知道了
http://referencesource.microsoft.com/#mscorlib/system/globalization/compareinfo.cs,0cba7af692b66098
------解决思路----------------------
如何比较字符串
// 查询数据库信息
/// <returns>方法返回DataTable对象</returns>
private DataTable GetStudent()
{
string P_Str_ConnectionStr = string.Format(//创建数据库连接字符串
@"server=WIN-GI7E47AND9R\LS;database=db_TomeTwo;uid=sa;pwd=");
string P_Str_SqlStr = string.Format(//创建SQL查询字符串
@"SELECT 学生姓名,CASE WHEN 所在学院 = '计算机学院'
THEN '计算机学院学生' ELSE '否' END AS 是否为计算机学院学生 FROM tb_Student");
SqlDataAdapter P_SqlDataAdapter = new SqlDataAdapter(//创建数据适配器
P_Str_SqlStr, P_Str_ConnectionStr);
DataTable P_dt = new DataTable();//创建数据表
P_SqlDataAdapter.Fill(P_dt);//填充数据表
return P_dt;//返回数据表
}//codego.net/1/4/139/
// 查询数据库信息
// <returns>方法返回DataTable对象</returns>
private DataTable GetMessage()
{
string P_Str_ConnectionStr = string.Format(//创建数据库连接字符串
@"server=WIN-GI7E47AND9R\LS;database=db_TomeTwo;uid=sa;pwd=");
string P_Str_SqlStr = string.Format(//创建SQL查询字符串
"SELECT 学生姓名,所在学院 FROM tb_Student");
SqlDataAdapter P_SqlDataAdapter = new SqlDataAdapter(//创建数据适配器
P_Str_SqlStr, P_Str_ConnectionStr);
DataTable P_dt = new DataTable();//创建数据表
P_SqlDataAdapter.Fill(P_dt);//填充数据表
return P_dt;//返回数据表
}