返回相同类型的相同类型的集合

时间:2013-04-06 16:25:17

标签: c# generics type-parameter

我正在尝试创建一个用于混洗集合的方法。我希望它是通用的,这意味着它应该采用类型为TCollection的元素的特定类型的集合(TEl)。我希望该方法返回包含相同类型的元素的相同类型的集合作为参数。

这是我到目前为止所尝试的:

internal static TCollection FisherYatesShuffle<TCollection, TEl>(this TCollection objects)
    where TCollection : IEnumerable<TEl>
{
    var ret = new TEl[objects.Count()];
    ret[0] = objects.First();
    var rand = new Random();
    for (var i = 1; i < objects.Count(); i++)
    {
        var j = rand.Next(0, i);
        ret[i] = ret[j];
        ret[j] = objects.ElementAt(i);
    }

    return ret; //CS0029: Cannot implicitly convert type 'TEl[]' to 'TCollection'
  //return (TCollection)ret; //CS0030: Cannot convert type 'TEl[]' to 'TCollection'
}

我尝试使用的泛型类型是否可行?如果是,我将如何改变我的方法?

1 个答案:

答案 0 :(得分:2)

您最好的选择是使用:

where TCollection : IList<TEl>, new()

然后

var result = new TCollection();
...
    result.Add(item)
...
return result;

虽然这不适用于数组 - 可能需要特殊情况。