如何在C#中创建自定义通用数字文本比较器以对数字/字符串列表进行排序?
我有一个数字文本列表,我想创建一个通用的自定义比较器逻辑,用C#对这个列表进行排序。例如如何在C#中创建自定义通用数字文本比较器以对数字/字符串列表进行排序?,c#,sorting,icomparable,C#,Sorting,Icomparable,我有一个数字文本列表,我想创建一个通用的自定义比较器逻辑,用C#对这个列表进行排序。例如 您的代码工作正常。东南方。结果: --, N/A, -888, -0.98, 0.00, 100 , --, Jim, Ken, NA, Peter, Smith 问题在于你的假设,“”和“-”在字母后面。因为他们在市场中的地位较低,所以他们排在第一位 这将是一个简单的解决方案。试一试 public int比较(字符串s1、字符串s2) { 双倍数字1,数字2; 变量isS1Numeric=double.
您的代码工作正常。东南方。结果:
--, N/A, -888, -0.98, 0.00, 100
, --, Jim, Ken, NA, Peter, Smith
问题在于你的假设,“”和“-”在字母后面。因为他们在市场中的地位较低,所以他们排在第一位
这将是一个简单的解决方案。试一试
public int比较(字符串s1、字符串s2)
{
双倍数字1,数字2;
变量isS1Numeric=double.TryParse(s1,out number1);
var isS2Numeric=double.TryParse(s2,输出编号2);
if(ISS1数字和ISS2数字)
{
如果(number1>number2)返回1;
if(number1
您的比较器到底有什么不起作用?排序顺序在这两种情况下都不符合预期。对,我的意思是您得到了什么,您期望得到什么?对于数字列表,我得到->--,N/A,-888,-0.98,0.00,100,对于字符串列表,我得到->空,-,Jim,Ken,N/A,Peter,Smith,您为什么期望空和“-”最后呢?暂时忘记数字,标准字符串比较将它们放在开头,而不是结尾。
public class NumberTextComparer : IComparer<string>
{
public int Compare(string s1, string s2)
{
double number1, number2;
var isS1Numeric = double.TryParse(s1, out number1);
var isS2Numeric = double.TryParse(s2, out number2);
if (isS1Numeric && isS2Numeric)
{
if (number1 > number2) return 1;
if (number1 < number2) return -1;
return 0;
}
return isS1Numeric ? 1 : (isS2Numeric ? -1 : String.Compare(s1, s2, StringComparison.OrdinalIgnoreCase));
}
}
var comparer = new NumberTextComparer();
var numericSortedListASC = numericList.OrderBy(str => str, comparer);
var stringSortedListASC = stringList.OrderBy(str => str, comparer);
--, N/A, -888, -0.98, 0.00, 100
, --, Jim, Ken, NA, Peter, Smith
public int Compare(string s1, string s2)
{
double number1, number2;
var isS1Numeric = double.TryParse(s1, out number1);
var isS2Numeric = double.TryParse(s2, out number2);
if (isS1Numeric && isS2Numeric)
{
if (number1 > number2) return 1;
if (number1 < number2) return -1;
return 0;
}
if (isS1Numeric)
return 1;
if (isS2Numeric)
return -1;
bool s1StartsWithLetter = char.IsLetter(s1.FirstOrDefault());
bool s2StartsWithLetter = char.IsLetter(s2.FirstOrDefault());
if (s1StartsWithLetter == s2StartsWithLetter)
return String.Compare(s1, s2, StringComparison.OrdinalIgnoreCase);
return s1StartsWithLetter ? -1 : 1;
}