c# - 返回同类型的同类型集合

标签 c# generics type-parameter

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

这是我迄今为止尝试过的:

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'
}

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

最佳答案

你最好的选择是使用:

where TCollection : IList<TEl>, new()

然后

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

但这不适用于数组 - 可能需要对它们进行特殊处理。

关于c# - 返回同类型的同类型集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15853210/

相关文章:

c# - 将对象序列化为数组

c# - 如何为 DataGridView 组合框列设置自动完成

rust - 为类型参数传递 Rust 生命周期

c# - 如何从配置生成器中的 Key Vault 获取 secret 值

c# - 在一个 Linq to Entities 查询中多次实现 "like"运算符

java - 如何让泛型函数根据Java中的输入获取对象属性

c# - 这些泛型类型在什么场景下统一?

java - super 通配符导致的编译错误

c# - 其中 t : multiple classes

scala - 为什么Scala不能绑定(bind)通配符类型参数?