包含多个数据类型的列表出现问题

本文关键字:问题 列表 数据类型 包含多 | 更新日期: 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

您有两个不同的泛型参数,TYPET是完全独立的参数,其中一个属于您的类,另一个属于方法。您只需要使用一个类型参数,而不需要使用两个。

此外,您还需要将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>,则无法在不进行转换的情况下将其添加到floatdouble。您必须在所有类型之间找到一个通用类型,在本例中为object,而不是Type。或者使用doubledecimal

我建议在您的代码中进行以下调整,这将真正帮助您理解您正在做的事情:

  • 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);
}

其他地方类似