包含多个数据类型的列表出现问题
本文关键字:问题 列表 数据类型 包含多 | 更新日期: 2023-09-27 18:05:04
对于一项大学任务,我被要求编写一个程序,其中包含一个类,该类可以查找某些数据类型的最大值和最小值。我们还必须满足以下要求:
- 利用具有IComparable<>的单个延迟类型的泛型约束
- 列表<>应创建(私有(以包含延迟类型的对象
- 应提供方法Add((,以允许将对象添加到List<>
- 方法Minimum((应返回存储在List<>中的最小值
- 方法Maximum((应返回存储在List<>中的最大值
- Main((方法必须演示正在使用的泛型类
以下是我对这项任务的痛苦尝试。
程序.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());
}
}
}
这是另一个类,我称之为泛型。
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);
}
}
}
以下是我目前遇到的一些错误:
- 无法将类型"T"隐式转换为"type">
- "T"不包含"CompareTo"的定义,也找不到接受类型为"T"的第一个参数的扩展方法"CompareTo"(是否缺少using指令或程序集引用?(
- 无法根据用法推断方法"task_eleven_point_three.Generics.Maximum(("的类型参数。请尝试显式指定类型参数
我通常不会为编程任务而烦恼,但泛型确实让我感到困惑。如果有人能修复我的代码,并告诉我我做错了什么,我将不胜感激。
泛型可能会让人困惑,所以不要觉得很糟糕。
问题中的第一个要点提到了一个类型约束,您还没有解决这个问题,但在这种情况下它很重要。它限制了您可以使用的泛型类型,因此最大和最小函数是有意义的。
你的类结构应该是这样的:
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
}
}
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
您有两个不同的泛型参数,TYPE
和T
是完全独立的参数,其中一个属于您的类,另一个属于方法。您只需要使用一个类型参数,而不需要使用两个。
此外,您还需要将IComparable<T>
添加到T
,您正试图在T
上调用CompareTo
方法,但约束在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
我建议在您的代码中进行以下调整,这将真正帮助您理解您正在做的事情:
- T是您的泛型类型参数。您不需要TYPE。在继续之前,请确保您了解泛型是什么。检查这个线程:什么是"<gt"C中的语法#
- 将
Generics<T>
的名称更改为MyList或MyCollection或。。。这样,当你阅读它时,它会发出优美的声音,你可以了解你的类是关于什么的:T的MyList,int的MyList等等 - 您需要对
IComparable<T>
进行约束。由于这是一项学生作业,我不会告诉你如何做,但我会解释它的含义。对泛型类型参数T
设置约束意味着您的T必须实现/扩展约束中指定的接口/类。因此,如果您的类中有一个约束class MyClass<T> where T : IEnumerable<char>
(读作T的MyClass,其中T实现了char的IEnumerable(,则意味着您将无法创建MyList<int>
的实例,因为"int"不实现IEnumerable<char>
。另一方面,字符串实现了IEnumerable<char>
,下面的内容是有效的:MyClass<string>
。除此之外,在类中,您可以对T对象调用IEnumerable<char>
中定义的任何方法
祝你好运!
在某些点上使用T,而在其他点上使用类型
如您在类声明中所述的T到TYPE
public void Add(T value)
{
_List.Add(value);
}
将上面的内容更改为此
public void Add(TYPE value)
{
_List.Add(value);
}
其他地方类似