对于大学任务,我被要求编写一个包含一个类的程序,该类可以找到某些数据类型的最大值和最小值。我们还必须满足以下要求:
以下是我在这项任务中的悲惨尝试。
的Program.cs:
using System;
using System.Collections.Generic;
namespace task_eleven_point_three
{
class Program
{
static void Main(string[] args)
{
Generics<Type> Test = new Generics<Type>();
Test.Add(3.1232M);
Test.Add(1534);
Test.Add(-74);
Test.Add(432F);
Console.WriteLine(Test.Maximum());
Console.WriteLine(Test.Minimum());
}
}
}
这是另一个类,我称之为Generics。
using System;
using System.Collections.Generic;
namespace task_eleven_point_three
{
class Generics<T>
{
private List<T> _List = new List<T>();
public TYPE Maximum<TYPE>()
where TYPE : IComparable<TYPE>
{
TYPE Result = _List[0];
for (int i = 1; i > _List.Count - 1; i++)
{
if (_List[i].CompareTo(Result) == 1)
Result = _List[i];
}
return Result;
}
public TYPE Minimum<TYPE>()
where TYPE : IComparable<TYPE>
{
TYPE Result = _List[0];
for (int i = 1; i > _List.Count - 1; i++)
{
if (_List[i].CompareTo(Result) == -1)
Result = _List[i];
}
return Result;
}
public void Add(T value)
{
_List.Add(value);
}
}
}
这些是我目前遇到的一些错误:
我通常不会为编程任务而烦恼,但是泛型真的让我很困惑。如果有人可以修改我的代码,并告诉我我做错了什么,我会非常感激。
答案 0 :(得分:0)
在某些积分上你使用T而在其他积分你是TYPE
你在课堂宣言中陈述的T to TYPE
public void Add(T value)
{
_List.Add(value);
}
将上方更改为此
public void Add(TYPE value)
{
_List.Add(value);
}
和其他地方类似
答案 1 :(得分:0)
您有两个不同的通用参数,TYPE
和T
是完全独立的参数,其中一个属于您的类,其他一个属于您的方法。您只需要使用一个类型参数不是两个。
您还需要将IComparable<T>
添加到T
,您试图在CompareTo
上调用T
方法,但T
上不存在约束},您将其应用于TYPE
,因此您收到以下错误:
'T'不包含'CompareTo'
的定义
更改您的代码:
class Generics<TYPE> where TYPE : IComparable<TYPE>
{
private List<TYPE> _List = new List<TYPE>();
并删除您在方法名称后指定的所有类型:
例如改变这个:
public TYPE Minimum<TYPE>()
要:
public TYPE Minimum()
并删除方法的所有约束。
此外,泛型是强类型的。这意味着,如果您创建Generics<int>
,则无法将其添加到 float 或 double 而不进行转换。您必须在所有类型之间找到一个公共类型,object
在这种情况下不是Type
。或者使用 double 或 decimal
答案 2 :(得分:0)
class Program
{
static void Main(string[] args)
{
Container<int> container = new Container<int>();
container.AddItem(4);
container.AddItem(11);
container.AddItem(6);
Console.WriteLine(container.GetMaximum());
Container<Person> container2 = new Container<Person>();
container2.AddItem(new Person() { Age = 36 });
container2.AddItem(new Person() { Age = 47 });
container2.AddItem(new Person() { Age = 48 });
Console.WriteLine(container2.GetMaximum().Age);
}
}
public class Container<T> where T : IComparable<T>
{
private readonly List<T> _items = new List<T>();
public void AddItem(T item)
{
_items.Add(item);
}
public T GetMaximum()
{
return _items.Max();
}
}
public class Person : IComparable<Person>
{
public int Age { get; set; }
public int CompareTo(Person other)
{
return Age.CompareTo(other.Age);
}
}
查看此页面:http://msdn.microsoft.com/en-us/library/ms379564%28VS.80%29.aspx
答案 3 :(得分:0)
泛型可能令人困惑,所以不要心疼。
您问题中的第一个要点提到了尚未解决的类型约束,但在这种情况下这很重要。它限制了您可以使用的泛型类型,因此最大和最小函数是有意义的。
您的班级结构应如下所示:
class GenericList<T> where T : IComparable<T> // <-- this is the type constraint: only allow types that implement IComparable<T>
{
private List<T> _list = new List<T>();
public void Add(T element)
{
// code for Add
}
public T Maximum()
{
// code for Maximum
}
public T Minimum()
{
// code for minimum
}
}
答案 4 :(得分:0)
我建议您在代码中进行以下调整,这实际上可以帮助您了解自己在做什么:
Generics<T>
的名称更改为MyList或MyCollection或......这样,当您阅读它时,它会发出美妙的声音,您可以了解您的课程内容:MyList of T ,MyList of int等。IComparable<T>
上的约束。由于这是学生作业,我不会告诉你如何做,但我会解释它的含义。对泛型类型参数T
设置约束意味着您的T必须实现/扩展约束中指定的接口/类。因此,如果您的班级中有一个约束class MyClass<T> where T : IEnumerable<char>
(读取 MyClass of T,其中T实现了IE 的IEnumerable),则意味着您将无法创建MyList<int>
,因为'int'没有实现IEnumerable<char>
。另一方面,字符串实现IEnumerable<char>
及其后续有效:MyClass<string>
。除此之外,在您的课程中,您可以在T对象上调用IEnumerable<char>
中定义的任何方法。