问题  需要一个解释

已加入
2018年10月3日
留言内容
3
编程经验
1-3
大家好,

我有一个要用C#上学的项目,这是我的代码的一部分。该代码可以正常工作,但是如果你们能给我一些有关应如何改进的提示,那就太好了。我很难理解为什么 new Cours(search) 用于查找具有相同名称的特定对象。 Cours类构造函数为name属性采用字符串参数,并实现IComparable接口。

这是一些代码:
C#:
private List<Cours> cours;

...

public Cours Search(string search){
      cours.Sort();
      int index = Array.BinarySearch(cours.ToArray(), new Cours(search));
      return cours[index];
}

谢谢

-米奇
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,568
地点
悉尼,澳大利亚
编程经验
10+
IComparable接口将比较两个实例并确定其相对大小的能力构建为一种类型。如果您拥有实例A,并调用其CompareTo方法并将实例B作为参数传递,则将返回一个“ int”值,该值指示哪个是"less" and which is "greater"比其他。返回的可能值通常为-1、0和1,但原则上可以是任何“ int”值。小于零的值表示实例A为"less"比实例B大,即当按升序排序时,A会比B大。大于零的值表示实例A为"greater"比实例B大,即当按升序排序时,A会紧随B之后。零值表示两个实例是等效的。该Array.BinarySearch方法将在您指定的数组中搜索一个元素,该元素与您提供的对象相比,从其CompareTo方法返回零值。您的Cours类的CompareTo方法可能是实现的,因此比较是在Name上完成的,例如
public class Cours : IComparable
{
    public string Name { get; set; }
    public int CompareTo(object obj)
    {
        return Name.CompareTo(((Cours) obj).Name);
    }
}

尽管您可能已经做过一件事情,但我会改变两件事。首先,优良作法是始终同时实现IComparable和IComparable<T>:
public class Cours : IComparable, IComparable<Cours>
{
    public string Name { get; set; }
    public int CompareTo(object obj)
    {
        return CompareTo((Cours) obj);
    }

    public int CompareTo(Cours other)
    {
        return Name.CompareTo(other.Name);
    }
}

您可能已经做过那件事,但是您确实提到了IComparable,所以也许没有。

另一个更改是不按该Search方法对List进行排序。可能不是问题,但该方法实际上不应在排序过程中更改List。与其先排序然后转换为数组,不如先将其转换为数组然后再排序。这意味着您正在对数组进行排序,并使List保持与找到状态相同的状态:
public Cours Search(string search){
      var arr = cours.ToArray();

      Array.Sort(arr);
      int index = Array.BinarySearch(arr, new Cours(search));
      return arr[index];
}

您甚至可以选择将排序作为转换的一部分:
public Cours Search(string search){
      var arr = cours.OrderBy(c => c).ToArray();

      int index = Array.BinarySearch(arr, new Cours(search));
      return arr[index];
}

实际上,对我而言,我要做的第三项更改也是更改该方法参数的名称。 “搜索”是一个坏名字。您是按名称搜索的,因此该参数应能反映出来,即我将参数称为“名称”:
public Cours Search(string name){
 
最佳 底部