2

コレクションをシャッフルする方法を作成しようとしています。TCollectionつまり、 type の要素の特定の型のコレクション ( ) を取る必要があり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'
}

使用しようとしているジェネリックのタイプは可能ですか? もしそうなら、どのように方法を変更する必要がありますか?

4

1 に答える 1

2

あなたの最善の策は、使用することです:

where TCollection : IList<TEl>, new()

その後

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

ただし、これは配列では機能しません-特殊なケースが必要になる場合があります。

于 2013-04-06T16:29:17.053 に答える