我想编写排序类' Person'。
班级'人员'包括"姓名","年龄","主要"。
喜欢这个。
class Person
{
public int Age;
public string Name;
public string Major;
public override string ToString()
{
return Name + ": " + Age + " , Major in " + Major;
}
public Person(int Age, string Name, string Major)
{
this.Age = Age;
this.Name = Name;
this.Major = Major;
}
}
我通过书来学习,并且只有" DescSortByName"代码:
static bool DescSortByName(object arg1, object arg2)
{
Person person1 = arg1 as Person;
Person person2 = arg2 as Person;
return person1.Name.CompareTo(person2.Name) < 0;
}
但我想编码用户可以选择什么样的属性和升序的降序。
所以我这样编码:
static bool SortByAll(object arg1, object arg2, string what, string updown)
{
Person person1 = arg1 as Person;
Person person2 = arg2 as Person;
int comp;
what = what.ToLower();
switch (what)
{
case "name":
comp = arg1.Name.CompareTo(arg2.Name); //1.
break;
case "age":
int xa = arg1.Age; int ya = arg2.Age; //2.
if (xa > ya) { comp = 1; }
else { comp = -1; }
break;
case "major":
comp = arg1.Major.CompareTo(arg2.Major); //3.
break;
}
if (updown == "Descending")
{ return comp == -1; } //4.
else { return comp == 1; }
}
前者绝对运作良好,但我的(后者)没有,我无法找到它们之间的区别。
在错误列表中,有两种错误。
在1,2,3中(我在代码中赞赞// 1。),错误是CS1061:
'object' does not contain a definition for 'Name' and no extension method 'Name'
accepting a first argument of type 'object' could be found
(are you missing a using directive or an assembly reference?).
和4中,错误是CS1056:
Use of unassigned local variable 'comp'.
...
请告诉我我做错了什么以及如何解决。
PS。我是韩国人,所以我不擅长英语,所以这些句子可能很尴尬。对不起。
PPS。我非常高兴收到所有其他反馈意见!
购买力平价。我没想到arg1
和arg2
的类型不是Person
。
答案 0 :(得分:1)
您的方法中有这些变量(作为方法参数):
object arg1, object arg2
你试着在这里使用它们:
arg1.Name.CompareTo(arg2.Name)
正如错误所述,object
没有名为Name
的属性。您可以使用您的Person
对象:
person1.Name.CompareTo(person2.Name)
如果NullReferenceException
的{{1}}不属于object
,则会冒Person
的风险。由于该方法假定它们必须属于Person
类型,因此只需完全删除Person
变量并更改方法以期望该类型:
static bool SortByAll(Person arg1, Person arg2, string what, string updown)
您正在使用comp
变量:
if (updown == "Descending")
{ return comp == -1; } //4.
else { return comp == 1; }
但是你无法保证该变量将具有值。这是编译器警告你的内容。只需在声明它时给它一个默认值:
int comp = 0;
答案 1 :(得分:0)
您的代码存在很多问题。
关于您获得的错误,您的方法是与键入的object
实例进行比较。 object
对您的班级Age
不知道Name
或Person
,所以您应该将方法签名更改为:
static bool SortByAll(Person arg1, Person arg2, string what, string uptown)
那就是说,让我们试着让你的方法变得不那么脆弱和安全。
descending
而不是Descending
,该方法将无法正常工作,更糟糕的是,编译器不会警告消费者他的代码中存在错误。在你的情况下,使用bool
likeo:
static bool SortByAll(Person arg1, Person arg2, string what, bool descending)
现在很明显,没有错误的余地。您可以通过true
或false
,两者都是您方法的合法选项。如果您需要3个或更多选项,那么最好的方法是使用enumerations。
what
参数也会出现同样的问题。如果消费者拼错该属性或仅指定Person
未实现的属性,会发生什么。再次,编译器将无法警告这样的错误,并且您的程序将在运行时崩溃,这是不好的。在这种情况下,您需要一种类型安全的方法让消费者定义在订购时使用的属性。欢迎来到泛型,Func<>
和lambdas。
static bool SortByAll<T>(Person arg1, Person arg2, Func<Person, T> what, bool descending)
你会像这样使用它:
SortByAll(Person p1, Person p2, p => p.Age, true);
我将实施方法留给你。
答案 2 :(得分:0)
public class Person
{
public int Age;
public string Name;
public string Major;
public override string ToString()
{
return Name + ": " + Age + " , Major in " + Major;
}
public Person(int Age, string Name, string Major)
{
this.Age = Age;
this.Name = Name;
this.Major = Major;
}
public int CompareTo(Person person, string updown, string what)
{
int comp = 0;
what = what.ToLower();
switch (what)
{
case "name":
comp = this.Name.CompareTo(person.Name); //1.
break;
case "age":
comp = this.Age.CompareTo(person.Age);
break;
case "major":
comp = this.Major.CompareTo(person.Major); //3.
break;
}
if (updown == "Descending")
{
return comp *= -1;
} //4.
else
{
return comp;
}
}
}