我有一个无序列表,看起来像这样:
1
2.2
1.1.1
3
当我对列表进行排序时,1.1.1变得大于3和2.2,而2.2变得大于3.
这是因为Double.Parse删除了点并使其成为整数.
这是我用来排序的方法:
public class CompareCategory: IComparer<Category>
{
public int Compare(Category c1, Category c2)
{
Double cat1 = Double.Parse(c1.prefix);
Double cat2 = Double.Parse(c2.prefix);
if (cat1 > cat2)
return 1;
else if (cat1 < cat2)
return -1;
else
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?谢谢
Joh*_*hnD 12
这些版本#s是偶然的吗?你可以使用的Version类?它按照您的需要对每个部件进行排序,尽管它最多只能处理4个部件.我不建议像你一样解析成数值.
它有一个IComparable界面.假设您的输入是字符串,这里是一个示例:
public class CompareCategory: IComparer<Category>
{
public int Compare(Category c1, Category c2)
{
var cat1 = new Version(c1.prefix);
var cat2 = new Version(c2.prefix);
if (cat1 > cat2)
return 1;
else if (cat1 < cat2)
return -1;
else
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你需要超过4个"部分"的东西,我想我会创建一个比较器,它将字符串分成点,然后将每个元素解析为整数并用数字进行比较.请务必考虑1.002.3和1.3.3之类的情况(您希望排序顺序是什么?).
更新,这是我的意思的样本.轻微测试:
public class CategoryComparer : Comparer<Category>
{
public override int Compare(Category x, Category y)
{
var xParts = x.prefix.Split(new[] { '.' });
var yParts = y.prefix.Split(new[] { '.' });
int index = 0;
while (true)
{
bool xHasValue = xParts.Length > index;
bool yHasValue = yParts.Length > index;
if (xHasValue && !yHasValue)
return 1; // x bigger
if (!xHasValue && yHasValue)
return -1; // y bigger
if (!xHasValue && !yHasValue)
return 0; // no more values -- same
var xValue = decimal.Parse("." + xParts[index]);
var yValue = decimal.Parse("." + yParts[index]);
if (xValue > yValue)
return 1; // x bigger
if (xValue < yValue)
return -1; // y bigger
index++;
}
}
}
public static void Main()
{
var categories = new List<Category>()
{
new Category { prefix = "1" },
new Category { prefix = "2.2" },
new Category { prefix = "1.1.1" },
new Category { prefix = "1.1.1" },
new Category { prefix = "1.001.1" },
new Category { prefix = "3" },
};
categories.Sort(new CategoryComparer());
foreach (var category in categories)
Console.WriteLine(category.prefix);
}
Run Code Online (Sandbox Code Playgroud)
输出:
1
1.001.1
1.1.1
1.1.1
2.2
3
Run Code Online (Sandbox Code Playgroud)