我有一种情况,即所有列表成员都具有相同的ID(Id是字符串而不是整数)。作为业务规则的一部分,我需要按升序对列表进行排序。我原来的实现与下面非常类似。由于所有列表成员都有相同的ID,我希望在应用排序后得到不变的列表,但令我惊讶的是结果不同。C#IComparer在比较相同字符串时返回意外结果
以下是我在排序前的原始列表。
编号:D1.2名称:厚头龙
编号:D1.2名称:阿马加龙属
编号:D1.2名称:马门溪龙
编号:D1.2名称:恐爪龙
编号:D1.2名称:腔骨龙
编号:D1.2名称:偷蛋龙
编号:D1.2名称:霸王龙
排序交替比较器:
编号:D1.2娜我:厚头龙
编号:D1.2名称:偷蛋龙
编号:D1.2名称:腔骨龙
编号:D1.2名称:恐爪龙
编号:D1.2名称:马门溪龙
编号:D1.2名称:阿马加龙属
编号:D1.2名称:霸王龙
代码
class Program
{
static void Main(string[] args)
{
new ComparerIssue().MainMethod();
Console.ReadKey();
}
}
internal class DinoComparer : IComparer<Dinosaur>
{
public int Compare(Dinosaur dinosaur1, Dinosaur dinosaur2)
{
return Compare(dinosaur1.Id, dinosaur2.Id);
}
private int Compare(string x, string y)
{
if (x == y)
{
return 1; //I have tried using 1 and 0; -1 throws exception
}
return x.CompareTo(y);
}
}
public class ComparerIssue
{
public void MainMethod()
{
List<Dinosaur> dinosaurs = new List<Dinosaur>();
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Pachycephalosaurus" });
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Amargasaurus" });
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Mamenchisaurus" });
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Deinonychus" });
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Coelophysis" });
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Oviraptor" });
dinosaurs.Add(new Dinosaur() { Id = "D1.2", Name = "Tyrannosaur" });
Display(dinosaurs);
DinoComparer dc = new DinoComparer();
Console.WriteLine("\nSort with alternate comparer:");
dinosaurs.Sort(dc);
Display(dinosaurs);
}
private static void Display(IEnumerable<Dinosaur> list)
{
Console.WriteLine();
foreach (Dinosaur dinosaur in list)
{
Console.WriteLine("Id: " + dinosaur.Id + " Name: " + dinosaur.Name);
}
}
}
public class Dinosaur
{
public string Id { get; set; }
public string Name { get; set; }
}
'if(x == y)'实际上会比较两个字符串,而不是它们的引用。比较他们的引用使用'object.ReferenceEquals'。 –