问题  Icomparer /界面问题

费尔南多

新成员
加入
2014年1月8日
消息
4
编程经验
1-3
嗨朋友们,

我一直在使用.NET进行编码几年并在做网站,但我没有使用界面,或者没有发现无论如何是否需要使用它。

在我的一些代码中,我使用了.NET的内置福彩12选5走势图功能(如arraylist.sort()),所以现在我试图修复我的Mindset更多使用界面,但如何?

我知道接口的语义,就像它是某种类型的合同,你需要坚持,所以在研究和阅读一些关于它的文章后,使用福彩12选5走势图时提到了IComparer。

但是如何使用ICompare当所有您必须进行IComparer继承IComparer然后实现您自己的代码逻辑来福彩12选5走势图,我已经看到了我已经看到的,我已经看到了直接使用的福彩12选5走势图方法,与ArrayList初始化变量,那么呼叫

arraylistvariablies.sort()

我希望你能得到我想说这里的东西,我想在我的代码中融合界面,我很难理解我的工作中的代码,也使用大量的界面实现,但我看不到为什么会用它。我也看过Dan Wahlin的视频,我知道如何定义和使用界面,但看到Icomparer和Icomparable的示例使其更加令人困惑!

谢谢你们。
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,161
地点
挪威
编程经验
10+
Icomparer仅有一个成员,您实现的比较方法以比较两个对象并返回之间的福彩12选5走势图关系。福彩12选5走势图方法知道此(接口合同)当您传递IDOMPARER实现时,并将调用此方法来确定对象的福彩12选5走势图顺序。

自从.NET 2.0宁愿使用强类型列表<T> and IComparer<T>虽然,而不是没有型号的ArrayList和Icomparer。
 

费尔南多

新成员
加入
2014年1月8日
消息
4
编程经验
1-3
谢谢约翰,但即使我不实施IComparer或Icomparable,也是这样做,而不是这样做:

列表<string> s = new List<string>();

我仍然可以这样做:

s.sort();

那么接口的使用是什么?
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
谢谢约翰,但即使我不实施IComparer或Icomparable,也是这样做,而不是这样做:

列表<string> s = new List<string>();

我仍然可以这样做:

s.sort();

那么接口的使用是什么?

字符串类实现了IComparable和Icomparable<string>所以你也在这种情况下使用该接口。如果没有办法比较字符串,那么就无法对它们进行福彩12选5走势图。如果您要创建某些类型的列表,其中不实现IComparable,那么您无法通过调用福彩12选5走势图来福彩12选5走势图该列表。这就是Icomparer进来的地方:您可以提供自己的Icomparer,其中列表可以用于对不提供自己的IComparable实现的对象进行福彩12选5走势图。

例如,假设您定义了此类:
 上市  class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}
如果你要创建一个列表<Person>并召唤其福彩12选5走势图方法,您希望发生什么?比较两个人对象没有固有的方法,因此没有办法将它们分类为任何有意义的顺序。为了能够对人的对象进行福彩12选5走势图,您必须告诉列表如何将它们进行比较,并且通过传递它实现IComparer的对象<Person>界面。然后,它可以使用该对象的比较方法比较两个人对象,并通过重复执行此类对象来福彩12选5走势图整个列表。如果您想要按名称福彩12选5走势图,那么您可以使用此实现:
 上市  class PersonNameComparer : IComparer, IComparer<Person>
{
    public int Compare(object x, object y)
    {
        return this.Compare((Person) x, (Person) y);
    }

    public int 比较(人X,人Y)
    {
        // Make use of the IComparable implementation of the String class.
        return x.Name.CompareTo(y.Name);
    }
}
如果你想要按年龄分类,那么你可以使用这个:
 上市  class PersonAgeComparer : IComparer, IComparer<Person>
{
    public int Compare(object x, object y)
    {
        return this.Compare((Person) x, (Person) y);
    }

    public int 比较(人X,人Y)
    {
        //利用Int32结构的可变实施。
        return x.age.compareto(y.age);
    }
}
在第一种情况下,通过其名称属性进行比较两个人对象,因此列表将按名称福彩12选5走势图。在第二种情况下,它将按年龄福彩12选5走势图,因为比较年龄属性。
 

费尔南多

新成员
加入
2014年1月8日
消息
4
编程经验
1-3
jmcil,

您的代码:

上市 比较(人X,人Y) {
//利用Int32结构的可变实施。
返回 x.age.compareto(y.age);
}

自年龄以来是已经具有CompareTo方法的字符串属性,那么为什么我仍然会使用IComparer / IComparable,因为我可以在没有实际使用接口的情况下实现相同的粘贴代码/方法?

请忍受我,我只是厚,是一个新手开发人员,我希望有人坚持我厚厚的大脑,我将使用无附带界面的原因。

欣赏你的代码,我得到了这样的用法,只是难以让自己说服界面的好处。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
自年龄以来是已经具有比较的字符串属性
年龄是类型int,而不是字符串,但该类型也有一个compareto方法。
那么,那么我仍然会使用Icomparer / Icomparable,因为我可以在没有实际使用接口的情况下实现相同的粘贴代码/方法?
你怎么能?你没有列表<int>; you have a List<Person>。如果要对列表进行福彩12选5走势图<Person>然后你必须能够比较人物对象。您如何将人物对象进行比较以确定优先级?事实上,没有办法比较定义的人对象,以便无法福彩12选5走势图。为了能够对列表进行福彩12选5走势图,您必须告诉列表如何比较其项目,这就是Icomparer实现的方式。它完全取决于您如何实现比较方法,但是比较方法必须在那里,因为这就是福彩12选5走势图方法要调用的方法。如果要按名称福彩12选5走势图,那么您的Icomparer会比较两个人对象的名称属性。如果您想要按昔日福彩12选5走势图,那么您的IComparer会比较年龄属性。如果您想按名称福彩12选5走势图,然后历史为单位,则您的IComparer会比较名称属性,然后比较段属性。只需通过实现不同的比较来对您想要的任何方式进行福彩12选5走势图。

你怎么尝试创建一个列表<Person>在其中的一些人物中,然后尝试在没有Icomparer的情况下对它进行福彩12选5走势图,看看会发生什么。

这是别的需要考虑。让我们说你有一个列表<string>并且您希望根据字符串的长度从最短到最长的字符串对其进行福彩12选5走势图。你会怎么做?如果您只需调用列表中的福彩12选5走势图,那么它将按字母顺序对它们进行福彩12选5走势图。答案是您可以创建一个ICompare的实现,其中比较方法将两个字符串与内容进行比较。然后,您可以将该类的实例传递给Sort方法,它将按长度对字符串进行福彩12选5走势图。
 

费尔南多

新成员
加入
2014年1月8日
消息
4
编程经验
1-3
它完全取决于您如何实现比较方法,但是比较方法必须在那里,因为这就是福彩12选5走势图方法要调用的方法。

好的,只是没有用的福彩12选5走势图(),但我对实施接口的关注,我引用了你。由于String类具有Compareto方法,我不必实现IComparer和Icomparable,而是创建了自己的方法(MyComparetest),并使用String的Compareto方法:

上市 班级 程序
{
静止的 空白 Main(细绳[] args)
{
程序 PROG = 新的 程序 ();
p1 = 新的 ("Peter",61);
p2 = 新的 ("James",72);
 
安慰 .writeline("Return value is: " + PROG.MYCOMCALTEST(P2,P1));
安慰 .readkey();
}
上市 MyCompareTest( X, y)
{
返回 x.name.compareto(y.name);
}
}


所以,在字符串级别下面潜伏在我提到的接口,也是如此使用?

我只是在询问的是,我已经使用了内置方法实现而不使用"contract"接口和实现它们,并执行我的方法以某种方式调用接口吗?

谢谢
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
好的,只是没有用的福彩12选5走势图(),但我对实施接口的关注,我引用了你。由于String类具有Compareto方法,我不必实现IComparer和Icomparable,而是创建了自己的方法(MyComparetest),并使用String的Compareto方法:

上市 班级 程序
{
静止的 空白 Main(细绳[] args)
{
程序 PROG = 新的 程序 ();
p1 = 新的 ("Peter",61);
p2 = 新的 ("James",72);
 
安慰 .writeline("Return value is: " + PROG.MYCOMCALTEST(P2,P1));
安慰 .readkey();
}
上市 MyCompareTest( X, y)
{
返回 x.name.compareto(y.name);
}
}


所以,在字符串级别下面潜伏在我提到的接口,也是如此使用?

我只是在询问的是,我已经使用了内置方法实现而不使用"contract"接口和实现它们,并执行我的方法以某种方式调用接口吗?

谢谢

首先,请不要将代码片段发布为HTML。正如您所看到的,虽然它保留了语法突出显示,但它会失去缩进,缩进是制作代码易于阅读的最重要的功能,特别是对于长片段。请按照我在POST#4中完成,然后使用[Xcode = C#]标记来格式化从IDE复制的纯文本。

至于问题,如果您要手动比较两个对象,那么不需要接口。在您的示例中,可以通过直接调用MyCompretest方法来对您的人类类的两个实例进行比较。同样,如果您想比较两个字符串对象,那么您可以调用其中一个的Compareto方法以及该方法是IComparable接口的成员的事实是无关紧要的。可以在没有IComparable接口的情况下实现相同的方法,它将正常工作。

如果IComparable变得重要的是,所需的类型的实例是隐含的,并且福彩12选5走势图是最明显的例子。如果您有一个Array或Person类的实例集合,则无法按照包含字符串或整数的方式对该数组或集合进行福彩12选5走势图。那是因为数组或集合不知道如何比较两个实例。它对您的mycomparetest方法无关,因此您的列表不会福彩12选5走势图。

简而言之,您不必实施IComparable,以便能够手动比较两个对象,但如果您希望它们能够自动比较。如果您要将方法添加到您的课程,其目的是比较两个实例,那么即使您不认为您需要它,也没有理由不实现IComparable和Icomparable。<T>.
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
最佳 底部