c#如何使用CompareTo比较类中的字符串?

时间:2018-11-05 14:47:24

标签: c#

很抱歉,以前的帖子,所以我将放置我的课程代码。

using System;

namespace U3_13
{
abstract class Narys
{
    public string Vardas { get; set; }
    public string Pavarde { get; set; }
    public DateTime GimimoData { get; set; }
    public Narys()
    {
    }
    public Narys(string vardas, string pavarde, DateTime gimimodata)
    {
        Vardas = vardas;
        Pavarde = pavarde;
        GimimoData = gimimodata;
    }
    public override bool Equals(object obj)
    {
        return this.Equals(obj as Narys);
    }
    public bool Equals(Narys narys)
    {
        if (Object.ReferenceEquals(narys, null))
        {
            return false;
        }
        if (this.GetType() != narys.GetType())
        {
            return false;
        }
        return (Vardas == narys.Vardas) && (Pavarde == narys.Pavarde);
    }
    public override int GetHashCode()
    {
        return Vardas.GetHashCode() ^ Pavarde.GetHashCode();
    }
    public static bool operator ==(Narys lhs, Narys rhs)
    {
        if (Object.ReferenceEquals(lhs, null))
        {
            if (Object.ReferenceEquals(rhs, null))
            {
                return true;
            }
            return false;
        }
        return lhs.Equals(rhs);
    }
    public static bool operator !=(Narys lhs, Narys rhs)
    {
        return !(lhs == rhs);
    }
    public static bool operator <=(Narys lhs, Narys rhs)
    {
        return lhs.Pavarde.CompareTo(rhs.Pavarde);
    }
    public static bool operator >=(Narys lhs, Narys rhs)
    {
        return (lhs.Pavarde.CompareTo() >= rhs.Pavarde.CompareTo());
    }
}
}

因此,如您所见,在类的结尾,这两个运算符<=和> =被写错了。我需要特别使用CompareTo,因为我的任务需要它,但是我不知道它是如何工作的。有些人说要写:

return lhs.Pavarde.CompareTo(rhs.Pavarde);

但是它给我一个错误,所以我需要帮助。顺便说一下,名字是用我的立陶宛语命名的,我将为您提供更好的理解。

Narys-成员;

Vardas-名字;

Pavarde-姓氏;

GimimoData-生日;

因此,我需要首先按姓氏排序,然后按姓氏排序(如果2具有相同的姓氏)。

2 个答案:

答案 0 :(得分:1)

看看documentation,它说明了CompareTo()的结果

  

小于零。该实例在 value 之前。

     

0 (该实例具有   与 value 在排序顺序中的位置相同。

     

大于零。该实例遵循 value 。 -或- value null

所以您必须更换

public static bool operator <=(Narys lhs, Narys rhs)
{
    return lhs.Pavarde.CompareTo(rhs.Pavarde); //syntax error here!
}
public static bool operator >=(Narys lhs, Narys rhs)
{
    return (lhs.Pavarde.CompareTo() >= rhs.Pavarde.CompareTo()); //syntax error here!
}

使用

public static bool operator <=(Narys lhs, Narys rhs)
{
    return lhs.Pavarde.CompareTo(rhs.Pavarde) <= 0;
}
public static bool operator >=(Narys lhs, Narys rhs)
{
    return (lhs.Pavarde.CompareTo(rhs.Pavarde)) >= 0;
}

答案 1 :(得分:0)

如果要使用排序方法进行比较,则应实现IComparable。我在两行之间阅读,这就是您想要做的。对不起,如果我误会了。这是您的操作方式:

abstract class Narys: IComparable
{
    ...
    public int CompareTo(object obj) 
    {
        if (obj == null) return 1;

        Nardys otherMember = obj as Nardys;
        if (otherMember != null) 
        {
            // Check to see if last name is the same
            if (this.Pavarde.CompareTo(otherMember.Pavarde)==0)
            {
                // Compare first names 
                return this.Vardas.CompareTo(otherMember.Vardas);
            }
            else
            {
                // Compare last names
                return this.Pavarde.CompareTo(otherMemder.Pavarde);
            }  
        }
        else
        {
            throw new ArgumentException("Object is not a Nardys");
        }
    }
}

现在您可以对数据执行Array.SortList.Sort。为此,无需重载运算符。