如题,有这样一个需求,在网上查了下找到两个解决方案:
1、list.Sort();
2、list.OrderBy();
写了个测试代码测试了下,发现两个都不靠谱,如下;
- list.Sort();
public class SortTest : MonoBehaviour
{
[SerializeField] private Text text1;
[SerializeField] private Text text2;
// Start is called before the first frame update
void Start()
{
List<Student> list = new List<Student>
{
new Student(){ID=0,Name="田二"},
new Student(){ID=1,Name="阿三"},
new Student(){ID=2,Name="赵四"},
new Student(){ID=3,Name="王五"},
new Student(){ID=4,Name="老六"},
new Student(){ID=5,Name="狗蛋"},
};
StringBuilder sb1 = new StringBuilder();
for (int i = 0; i < list.Count; i++)
{
sb1.Append(list[i].Name + ",");
}
text1.text ="排序前:"+ sb1.ToString();
// 设置区域性为中文(简体)
CultureInfo culture = new CultureInfo("zh-CN");
// 创建比较选项
CompareOptions options = CompareOptions.IgnoreCase;
#region 修改内容
list.Sort((x, y) => string.Compare(x.Name, y.Name, culture, options));
StringBuilder sb2 = new StringBuilder();
for (int i = 0; i < list.Count; i++)
{
sb2.Append(list[i].Name + ",");
}
#endregion
text2.text = "排序后:"+ sb2.ToString();
}
得到的结果如下;
正确的顺序应该是“阿三、狗蛋、老六、田二、王五、赵四”,结果不一样,没啥用,接着用第二种。
- list.OrderBy();
只需要将修改内容改为以下代码即可;
List<Student> list2 = list.OrderBy(w=>w.Name).ToList();
StringBuilder sb2 = new StringBuilder();
for (int i = 0; i < list2.Count; i++)
{
sb2.Append(list2[i].Name + ",");
}
结果一样的,依然没什么卵用;
百度上找了半天没找到办法,问了下chatGpt,轻松搞定。
方法是这样,我们可以自定义一个比较器,实现IComparer<string>接口,代码如下;
public class ChineseNameComparer : IComparer<string>
{
public int Compare(string x, string y)
{
CultureInfo cultureInfo = new CultureInfo("zh-CN");
string pinyinX = GetPinYin(x, cultureInfo);
string pinyinY = GetPinYin(y, cultureInfo);
return string.CompareOrdinal(pinyinX, pinyinY);
}
private string GetPinYin(string input, CultureInfo cultureInfo)
{
// 使用System.Globalization.ChineseCharacter toPinYin()将中文转换为拼音
string pinyin = "";
foreach (char c in input)
{
if (ChineseChar.IsValidChar(c))
{
ChineseChar chineseChar = new ChineseChar(c);
pinyin += chineseChar.Pinyins[0].ToString().Substring(0, 1);
}
else
{
pinyin += c.ToString();
}
}
return pinyin;
}
}
我们添加了一个名为GetPinYin的私有辅助函数,该函数使用了名为ChineseChar的开源库来将中文转换为拼音。这个库可以在网上找一个下载下或者直接在C盘搜一下。
然后,我们创建了一个ChineseNameComparer类,它实现了IComparer<string> 接口,在Compare方法中按拼音进行比较。我们还将转换为拼音的逻辑放入了GetPinYin函数中。
接下来,只需要将修改内容里面的比较方法替换下就可以呢。
ChineseNameComparer comparer = new ChineseNameComparer();
list.Sort((x, y) => comparer.Compare(x.Name, y.Name));
StringBuilder sb2 = new StringBuilder();
for (int i = 0; i < list.Count; i++)
{
sb2.Append(list[i].Name + ",");
}
text2.text = "排序后:"+ sb2.ToString();
得到的结果如下,轻松拿捏,ChatGPT真是码农的福音啊。
转载请注明出处。