包含多种数据类型的列表的问题

时间:2014-05-26 12:32:21

标签: c# generics icomparable

对于大学任务,我被要求编写一个包含一个类的程序,该类可以找到某些数据类型的最大值和最小值。我们还必须满足以下要求:

  • 使用IComparable<>利用单个延迟类型利用泛型约束;
  • 列表<>应该创建(私有)以包含延迟类型的对象;
  • 应提供方法Add()以允许将对象添加到List<>;
  • 方法Minimum()应返回存储在List<>;
  • 中的最小值
  • 方法Maximum()应返回存储在List<>;
  • 中的最大值
  • Main()方法必须演示正在使用的通用类

以下是我在这项任务中的悲惨尝试。

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

这些是我目前遇到的一些错误:

  • 无法将类型'T'隐式转换为'TYPE'
  • 'T'不包含'CompareTo'的定义,并且没有扩展方法'CompareTo'可以找到接受类型'T'的第一个参数(你是否缺少using指令或汇编引用?)
  • 无法从用法推断出方法'task_eleven_point_three.Generics.Maximum()'的类型参数。尝试明确指定类型参数。

我通常不会为编程任务而烦恼,但是泛型真的让我很困惑。如果有人可以修改我的代码,并告诉我我做错了什么,我会非常感激。

5 个答案:

答案 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)

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

您还需要将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)

我建议您在代码中进行以下调整,这实际上可以帮助您了解自己在做什么:

  • T是您的通用类型参数。你不需要TYPE。在继续之前,请确保您了解泛型是什么。检查此主题:What is the "< >" syntax within C#
  • 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>中定义的任何方法。
祝你好运!