【发布时间】:2021-09-28 00:26:03
【问题描述】:
我有一个要排序的文本文件。
每一行都有一个包名、一个管道和一个版本号。
例子:
- 自动夹具|4.15.0
- Castle.Windsor.Lifestyles|0.3.0
我尝试使用默认的 list.Sort() 方法但我得到了:
AutoFixture|4.15.0
Castle.Core|3.3.0
Castle.Windsor.Lifestyles|0.3.0
Castle.Windsor|3.3.0
FluentAssertions|5.10.3
代替
AutoFixture|4.15.0
Castle.Core|3.3.0
Castle.Windsor|3.3.0
Castle.Windsor.Lifestyles|0.3.0
FluentAssertions|5.10.3
如图所示,我希望“Castle.Windsor”出现在“Castle.Windsor.Lifestyles”之前。 我很确定我必须使用 IComparer,但我找不到先获得较短名称的方法。
到目前为止,我创建了一个这样的自定义排序,但它不起作用..
public class PackageComparer : IComparer<string>
{
// Assume that each line has the format: name|number
private readonly Regex packageRegEx = new Regex(@"[\w.]+\|[\d.]+", RegexOptions.Compiled);
public int Compare(string x, string y)
{
var firstPackage = this.packageRegEx.Match(x);
var firstLeft = firstPackage.Groups[1].Value;
var firstRight = firstPackage.Groups[2].Value;
var secondPackage = this.packageRegEx.Match(y);
var secondLeft = secondPackage.Groups[1].Value;
var secondRight = secondPackage.Groups[2].Value;
if (firstLeft < secondLeft)
{
return -1;
}
if (firstRight > secondLeft)
{
return 1;
}
return string.CompareOrdinal(firstSceneAlpha, secondSceneAlpha);
}
}
【问题讨论】:
-
您是否在调试器中运行它以确保比较器正在运行?正则表达式是否按照您的预期拆分值?
-
另外我在你的正则表达式中看不到任何分组,所以
Groups[1]和Groups[2]应该抛出异常。 -
确实,代码坏了。我只是不确定如何使用 IComparer 进行两次排序。
标签: c# .net algorithm sorting icomparer