Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实现IComparable_C#_Icomparable - Fatal编程技术网

C# 实现IComparable

C# 实现IComparable,c#,icomparable,C#,Icomparable,我正在实现IComparable,以便像类型化对象一样进行排序。我的问题是为什么它将类型person转换为int32?数组的Sort()似乎将数组中的每个类型转换为我用于比较的类型 可比: public class Person:IComparable { protected int age; public int Age { get; set; } public int CompareTo(object obj) { if(obj is Person

我正在实现IComparable,以便像类型化对象一样进行排序。我的问题是为什么它将类型person转换为int32?数组的Sort()似乎将数组中的每个类型转换为我用于比较的类型

可比:

public class Person:IComparable 
{
   protected int age;

   public int Age { get; set; }

   public int CompareTo(object obj)
   {
       if(obj is Person)
       {
           var person = (Person) obj;
          return age.CompareTo(person.age);
       }
       else
       {
           throw new ArgumentException("Object is not of type Person");
       }
   }
}
}

您的线路:

array.Add(p1.Age = 6)

将语句
p1.Age=6
的结果添加到ArrayList。这是整数值6。与IComparable或Sort无关。

您正在将person.Age添加到arraylist中,person.Age是一个整数。
你应该这样做

Person p1 = new Person(){Age=3};
array.Add(p1);

您没有将人员添加到数组中

p1.Age = 6
是赋值,它返回分配给变量/属性的任何内容(在本例中为6)

在将人员放入数组之前,您需要完成任务

p1.Age = 6

如果只希望将单个类型的元素放入集合中,则希望使用类型化集合而不是非类型化集合。这会立即发现问题。

实现
IComparable
的最佳方法是实现
IComparable
,并将调用传递给该实现:

class Person : IComparable<Person>, IComparable
{
  public int Age { get; set; }

  public int CompareTo(Person other)
  {
    // Should be a null check here...
    return this.Age.CompareTo(other.Age);
  }

  public int CompareTo(object obj)
  {
    // Should be a null check here...
    var otherPerson = obj as Person;
    if (otherPerson == null) throw new ArgumentException("...");
    // Call the generic interface's implementation:
    return CompareTo(otherPerson);
  }
}
class-Person:IComparable,IComparable
{
公共整数{get;set;}
公共int比较(其他人)
{
//此处应为空检查。。。
返回此.Age.CompareTo(其他.Age);
}
公共整数比较(对象对象对象)
{
//此处应为空检查。。。
var otherPerson=对象作为人;
如果(otherPerson==null)抛出新的ArgumentException(“…”);
//调用通用接口的实现:
将比较返回给(其他人);
}
}

BTW:如果您使用的是.Net 3.5,则不需要使用Sort()和IComparable。有一种新的扩展方法叫OrderBy,它比Sort更容易使用。如果他在.NET3.5(或2.0)上,他真的不应该使用ArrayList,而应该使用List。如果他这样做了,他就不会有这个问题(他会得到一个编译错误,它可能会解决问题)。为什么不使用泛型
列表
IComparable
?此外,泛型的使用在这里也会有所启示。如果您使用.Net 2.0或更高版本作为提示,最好使用泛型键入。。我可能会在实践中使用IList。这只是一个使用IComparabley获得comfotable的小实验,如果(other==null)返回1,您可能需要添加它;在你的CompareTo@Tymek,很好的一点是,此实现不能很好地处理其他类型(异构集合)的对象,甚至不能处理相同类型的空对象。