返回一个通用的IEnumerable <t> </t>

时间:2012-07-11 20:59:51

标签: c# generics ienumerable

我正在搞乱泛型和IEnumerable abit,但我有点卡住了。 这是我正在尝试做的事情: 我想有一个方法返回任何集合类型 - 实现IEnumerable(?) - (例如:List,Stack,Queue,...)

此外,我希望能够返回任何数据类型的任何集合类型。 所以我希望这种方法能够返回List<string>,以及Stack<int>,以及List<double> ...等等。

 public IEnumerable<T> returnSomething() 
    {
        Stack<int> stackOfInts = new Stack<int>();
        List<string> listOfStrings = new List<string>();
        return stackOfInts;
    }

这是我到目前为止所尝试过的。但这不起作用,我得到这个错误:

Cannot implicitly convert type 'System.Collections.Generic.Stack<int>' to 'System.Collections.Generic.IEnumerable<T>'. An explicit conversion exists (are you missing a cast?)

但是,如果我将方法签名中的IEnumerable<T>替换为IEnumerable<int>,我可以返回int类型的任何集合。但这意味着,现在我再也无法返回ListOfStrings

非常感谢任何建议或想法:)

6 个答案:

答案 0 :(得分:29)

您需要在方法中添加generic type parameter

public IEnumerable<T> ReturnSomething<T>() 
{
    Stack<T> stackOfT = new Stack<T>();
    return stackOfT;
}

类型参数出现在方法名称之后,但在参数之前。也可以使用具有多个类型参数的方法。

调用方法时,您可以指定类型:

IEnumerable<int> myInts = ReturnSomething<int>();

答案 1 :(得分:11)

诀窍是声明 <T>,如果你定义了通用<T>,那么你必须在你的方法中坚持它,所以如果你有{{1然后在您的方法的其他地方,您必须使用IEnumerable<T>而不是<T>或任何其他类型。

只有当你真正使用你的泛型类型时,才能将通用<int>替换为真实类型。

查看示例

<T>

答案 2 :(得分:3)

public IEnumerable<T> returnSomething() 
{
    Stack<int> stackOfInts = new Stack<int>();
    return (IEnumerable<T>) stackOfInts;
}

答案 3 :(得分:2)

类型参数需要由调用者在某处指定。

在实例化泛型类时:

public class MyClass<T>
{
    public IEnumerable<T> returnSomething()
    {
        Stack<T> stackOfTs = new Stack<T>();
        List<T> listOfTs = new List<T>();
        return stackOfTs;
    }
}

var v = new MyClass<int>();
foreach(var item in v.returnSomething())
{
}

或者在调用非泛型类的泛型方法时:

public class MyClass
{
    public IEnumerable<T> returnSomething<T>()
    {
        Stack<T> stackOfTs = new Stack<T>();
        List<T> listOfTs = new List<T>();
        return stackOfTs;
    } 
}


var v = new MyClass();
foreach(var item in v.returnSomething<int>())
{
}

答案 4 :(得分:0)

是的,如果您更改I Enumerable<T> to IEnumerable<dynamic>

,则可以返回任何类型 像这样:

public IEnumerable<dynamic> returnSomething() 
{
.....

答案 5 :(得分:0)

有关以下内容的完整帮助,请参见...

我的模型是

import cv2
import numpy as np
import sys

img = cv2.imread(sys.argv[1],0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
                            param1=50,param2=30,minRadius=5,maxRadius=25)

circles = np.uint16(np.around(circles))
for i in circles[0,:]:
    # draw the outer circle
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    # draw the center of the circle
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

IE无数的返回数据列表

  public class Student
{
    public int studentId { get; set; }
    public string studentName { get; set; }
    public string subject { get; set; }
    public string studentClass { get; set; }
    public int RollNumber { get; set; }

}

最后一个是访问代码

 public static IEnumerable<Student> ReturnSomething()
        {
            IList<Student> studentList = new List<Student>()
            {
                new Student()
                    {studentId = 1, studentName = "Bill", subject = "Science", studentClass = "nine", RollNumber = 01},
                new Student()
                    {studentId = 2, studentName = "Steve", subject = "Arts", studentClass = "ten", RollNumber = 03},
                new Student()
                    {studentId = 3, studentName = "Ram", subject = "Commerce", studentClass = "nine", RollNumber = 05},
                new Student()
                    {studentId = 1, studentName = "Moin", subject = "Science", studentClass = "ten", RollNumber = 06}
            };

            return studentList;
        }