gpt4 book ai didi

c# - CompareTo 方法不起作用,它不会从 Album 类中获取 AlbumName - 我认为是 IComparable 问题

转载 作者:行者123 更新时间:2023-12-03 07:50:40 25 4
gpt4 key购买 nike

我试图让我的 CompareTo 方法从 Artist 类中工作,但是它不会从 Album 类中获取 AlbumName 。我很确定这是专辑类上的 IComparable 的问题。请帮助提供代码特定的答案,谢谢。

错误 1“Assignment.Album”未实现接口(interface)成员“System.IComparable.CompareTo(object)”

专辑类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Assignment
{
class Album : IComparable
{
public string albumName;

public Album(string albumName)//constructors
{
this.albumName = albumName;

}

public string AlbumName
{
get { return albumName; }
set { albumName = AlbumName; }
}
}
}

艺人类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Assignment
{
public class Artist : IComparable
{
private String name;
int members = 4;//default number of members
//string albumName;

LinkedList<Artist> albums = new LinkedList<Artist>();

public override string ToString()//to make my own toString method
{
return ("Name: " + name + "Number of Members: " + members);
}

public Artist(string name, int members)//constructors
{
this.name = name;
this.members = members;
}

public string Name
{
get { return name; }
set { name = Name; }
}

public int Members
{
get { return members; }
set { members = value; }
}

public int CompareTo(object obj)
{
if (obj is Artist) //compare by name
{
Artist other = (Artist)obj;
return name.CompareTo(other.name);//artist name
}
if (obj is string) //compare against list of album titles
{
string other = obj.ToString();

if (obj.Equals(name.AlbumName))
return 0;

return -1;
}
else
return -999; //indicates can’t make a comparison
}

}
}

最佳答案

您发布的错误消息说您的 Album 类中没有 Compare(object) 方法。您的代码证实了这一点。所以……加一个!

编辑

好的,让我们分解一下。你显然学到了很多东西,并尝试了很多新东西。那太棒了。对你的目标和工具有一个扎实的想法很有帮助,所以让我们来谈谈这些。

根据您的评论,很明显您打算使用 IComparable用于排序和保证表单的唯一性。一般IComparable不用于唯一性,但您有“业务需求”来使用它,所以......

让我们谈谈手头的工具。我想你只需要了解IComparable方法。这意味着实现它的类具有自然顺序,例如列表中的数字或(咳咳)名称。具体来说,它保证了三个非异常结果:

  • this是“小于”参数:返回一些小于 0 的数字
  • this是“大于”参数:返回大于 0 的数字
  • this与参数的顺序相同:返回 0。

  • 就是这样。

    使用接口(interface)的东西往往是对项目进行排序的集合。他们用这个数字来指导他们的分类。他们唯一关心的是这个数字是小于、大于还是等于零。返回号不代表其他任何东西,所以返回 -999正如你所做的那样,不会告诉任何人任何有用的东西。如果您真正拥有的任何东西都无法比较,那么正确的做法是抛出异常。

    所以希望你知道 IComparable用到了,我们来说说它通常是怎么实现的。

    你听说过泛型吗?它是 .NET 的一项基本功能,它将根据类型指导代码的编译和执行。如果一个接口(interface)是通用的,这意味着你可以实现多次,每次指定不同的类型。有 IComparable 的通用版本: System.IComparable<T> .如果你的类需要比较字符串,它应该实现 IComparable<string>以及 IComparable<Artist>或者你有什么。如果这样做,您的类(class)将如下所示:
    public class Artist : IComparable<string>, IComparable<Artist>
    {
    // your code here

    public int Compare(string name)
    {
    // your code here
    }

    public int Compare(Artist artist)
    {
    // your code here
    }
    }

    如果您正在使用像 Windows 窗体这样需要非泛型 IComparable 的旧技术接口(interface),你也可以像这样实现它:
    public int Compare(object obj)
    {
    if (obj == null) return -1; // maybe you want to throw an exception instead?
    if (obj is string) return Compare((string) obj);
    if (obj is Artist) return Compare((Artist) obj);

    throw new ArgumentException("wtf, unexpected type");
    }

    最后,为什么你的艺术家名单是专辑类的?想想需要在哪里检查唯一性。当用户输入表单时会发生这种情况,对吗?你不认为列表也属于那里吗?

    关于c# - CompareTo 方法不起作用,它不会从 Album 类中获取 AlbumName - 我认为是 IComparable 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530854/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com