读书人

一个很菜的有关问题希望好心人能解答

发布时间: 2012-02-29 16:44:10 作者: rapoo

一个很菜的问题希望好心人能解答!
C# 入门经典(第三版) 第12章 泛型
全文在下面的链接中
http://book.csdn.net/bookfiles/30/10030856.shtml
当中的例子 CH12Ex03

.
.
.
(7) 添加一个新类VectorDelegates。

(8) 修改VectorDelegates.cs中的代码,如下所示:

public static class VectorDelegates

{

public static int Compare(Vector x, Vector y)

{

if (x.R > y.R)

{

return 1;

}

else if (x.R < y.R)

{

return -1;

}

return 0;

}


public static bool TopRightQuadrant(Vector target)

{

if (target.Theta >= 0.0 && target.Theta <= 90.0)

{

return true;

}

else

{

return false;

}

}

}

(9) 修改Program.cs中的代码,如下所示:

static void Main(string[] args)

{

Vectors route = new Vectors();

route.Add(new Vector(2.0, 90.0));

route.Add(new Vector(1.0, 180.0));

route.Add(new Vector(0.5, 45.0));

route.Add(new Vector(2.5, 315.0));


Console.WriteLine(route.Sum());


Comparison <Vector> sorter = new Comparison <Vector>(VectorDelegates.Compare);

route.Sort(sorter);

Console.WriteLine(route.Sum());


Predicate <Vector> searcher =

new Predicate <Vector>(VectorDelegates.TopRightQuadrant);

Vectors topRightQuadrantRoute = new Vectors(route.FindAll(searcher));
Console.WriteLine(topRightQuadrantRoute.Sum());


Console.ReadKey();

}

.
.
.

红色字体的部分,不明白!

Comparison 泛型委托
Comparison <Vector> sorter = new Comparison <Vector>(VectorDelegates.Compare);
表示比较同一类型的两个对象的方法。 返回值 0, <0 ,>0
那实例化的sorter是什么呢?
当中的参数VectorDelegates.Compare........真的不理解!
太多的疑问了,请好心人帮忙答疑解惑!


[解决办法]
首先没看到红色字体
Comparison <Vector> sorter = new Comparison <Vector>(VectorDelegates.Compare);
这个不是一个构造吗?
[解决办法]
泛型 很好用 功能很强大 不过我也在学习中

帮你UP下!


[解决办法]
Comparison是委托对吧,所以正常情况下使用委托就是
Comparison <Vector> sorter = new Comparison <Vector>(VectorDelegates.Compare);

根据一个函数生成这个委托,你也可以这么写
route.Sort(VectorDelegates.Compare);

还可以这么写
route.Sort(delegate(Vector x, Vector y)
{
if (x.R > y.R)
{
return 1;
}
else if (x.R < y.R)
{
return -1;
}
return 0;
});



[解决办法]
Comparison<T> 泛型委托表示比较同一类型的两个对象的方法。
此委托由 Array 类的 Sort<(Of <(T>)>)(array<T>[]()[], Comparison<(Of <(T>)>)) 方法重载和 List<(Of <(T>)>) 类的 Sort(Comparison<(Of <(T>)>)) 方法重载使用,用于对数组或列表中的元素进行排序。

[解决办法]
List的Sort()方法其中一个重载是接受泛型委托作为参数
CompareDinosByLength是一个方法,作为参数传到List的Sort()中
------解决方案--------------------


bqb 2008年06月13日 11点27分21秒 说:
SORT 是Comparison<>中的一个方法吗?
bqb 2008年06月13日 11点28分41秒 说:
dinosaurs.Sort(CompareDinosByLength);
为什么传CompareDinosByLength这个参数就能排序?
====================================================

首先我劝你先看看delegate的概念,泛型委托只不过是是delegate更强大而已。其他的没有关系。之所以可以这样
dinosaurs.Sort(CompareDinosByLength);
这是因为c#2.0里里面简化了对委托的使用,在1.1里要这样
dinosaurs.Sort(new Comparison<object>(CompareDinosByLength));
[解决办法]
给你展现下泛型委托的好处,快速反射得到实体属性的值

C# code
delegate R Func<T, R>(T t);                       //泛型委托class Program8     {         class User                               //实体类        {             string _name;             public string Name             {                 get { return _name; }                 set { this._name = value; }             }         }                  class QuickReflection <T>                //快速反射类        {             //生成泛型委托            public static Func <T, R> Get_GetDelegate <R>(string pName)             {                 Type t = typeof(T);                 PropertyInfo p = t.GetProperty(pName);                 return (Func <T, R>)Delegate.CreateDelegate(typeof(Func <T, R>), p.GetGetMethod());             }         }         public static void Main()         {             User u = new User();             u.Name = "Lucifer";             //快速访问实体属性值            Console.Write(QuickReflection <User>.Get_GetDelegate <string>("Name")(u));         }    }
[解决办法]
泛型不是简单的让程序执行效率更高,更安全。泛型是一种更高的抽象概念,等你接触了Linq你就能体会出来了。
[解决办法]
楼主,我感觉你看书看的方式不对!

[解决办法]
这段代码主要是在委托上
你先把委托的概念理解一下吧
参考如下
http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html

http://msdn.microsoft.com/zh-cn/library/900fyy8e(VS.80).aspx
[解决办法]
不要让一个问题给绊倒!
泛型不是很好理解,日常工作中就理解了!!
[解决办法]
委托相当于c语言中的指针!指向一个方法!!

VectorDelegates.Compare应该是一个方法!!
[解决办法]
相同指的是返回类型相同,参数类型相同,参数数量一样!!!
[解决办法]
bqb 2008年06月13日 14点32分14秒 说:
不好意思啊,我还没有明白!

Comparison <Vector> sorter = new Comparison <Vector>(VectorDelegates.Compare);
VectorDelegates.Compare 作为 Comparison <Vector>委托的签名
委托实例sorter应该要有两个参数,怎么没有 sorter(参数1,参数2),而且返回值应该是: 1,-1,0
==============================================================================

强烈要求你还本书看,你看了半天都没理解委托的概念说明这本书不好。

public delegate int Comparison<T>(T x, T y); 这个是Comparison委托的定义,你说他有2个参数是吧x,y。这就说明凡是有两个参数通过返回值为int类型的它全能比配。但是要怎么使用呢。就是这样:
Comparison <Vector> sorter = new Comparison <Vector>(VectorDelegates.Compare);
这样就把VectorDelegates.Compare函数委托给Comparison <Vector>,而他的实例就是sorter,明白了。最简单的delegate就是一种特殊的class所以必须要new的,你使用的sorter就是delegate的实例,delegate的构造参数就一个函数
[解决办法]
就是一个泛型委托,指向了你VectorDelegates类中定义的泛型方法,从这个类名的英文单词VectorDelegates就可以知道了,哈哈
[解决办法]
你看到不会的方法,查msdm上边一般会有示例代码
------解决方案--------------------


什么都不懂时要问题,其实人家都讲的很明白的了,自己还是不理解,这种感觉真的好痛苦!等明白后
真的是些基本的东西。在这里要非常感谢回帖的各位好心人!太感谢抽时间帮我看问题和耐心讲解!
==
都是从这步走过来的

读书人网 >C#

热点推荐