开发者

Class<type> in C#

I have a class and want to work with it as Lists: e.g. List<int>, List<string>, ... , List<T> I have a class Randomizor which will take the collection data type that will be shuffled. How can I do so?

class Rando开发者_StackOverflow社区mizor<T>
{
    public Randomizor()
    {

    }

    public Array Shuffle(Array toShuffle)
    {

    }
}


Create a generic class like so:

class Randomizer<TList, TType> where TList : IList<TType>
{
    public TList Randomize(TList list)
    {
        // ...
    }
}

Or like so:

class Randomizer<T>
{
    public IList<T> Randomize(IList<T> list)
    {
        // ...
    }
}


Not very clear question... do you mean something like this?

public static class Randomizer<T>
{
   public static T GetRandom(List<T> list)
   {
      T value = default(T);
      // Perform some random logic.

      return value;
   }
}


EDIT: I found two superior impementations after a little digging so I would suggest those in preference.

An extension method for this purpose and already been suggested previously here I include the code paraphrased to Shuffle below.

public static IEnumerable<T> Shuffle<T> (this IEnumerable<T> source)
{     
    Random random = new Random ();     
    T [] copy = source.ToArray ();      
    for (int i = copy.Length - 1; i >= 0; i--) 
    {         
        int index = random.Next (i + 1);
        yield return copy [index];
        copy [index] = copy [i];
    }
}

And an interesting solution adapted from this linq approach

public static IEnumerable<T> Shuffle<T> (this IEnumerable<T> source)
{     
    Random random = new Random ();     
    return source.OrderBy(i => Random.Next()).AsEnumerable();
}

The orignal answer but slower than the edits

public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> sequence) 
{     
    Random random = new Random();
    List<T> copy = sequence.ToList();
    while (copy.Count > 0)
    {
        int index = random.Next(copy.Count);
        yield return copy[index];
        copy.RemoveAt(index);
    }
} 

If you like one of these you should up vote the linked answer.

If you are very concerned about randomness, you could upgrade to one of the RNG algorithms from the Crypto API and seed it with some non deterministic value, like somthing generated from recent mouse activity. I suspect that would be overkill and it would degrade performance.


class Randomizor<T>
{
    public Randomizor()
    {

    }

    public List<T> Shuffle(List<T> toShuffle)
    {

    }
}


class Randomizer<T>
{
    public Randomizer(ICollection<T> collection)
    {
        //Do something with collection using T as the type of the elements
    }            
}

However you may want to go for a generic extension method

static class Randomizer
{
    public static void Randomize<T>(this ICollection<T> collection)
    {
        //randomize the collection
    }
}

and the usage:

List<int> list = new List<int> { 1, 2, 3, 4, 5 };
list.Randomize();


Maybe like this:

    public List<T> Shuffle<T>(List<T> toShuffle)
    {
        return toShuffle.OrderBy(x => Guid.NewGuid()).ToList();
    }

Or as an extension method

public static class Extensions
{
    public static List<T> Shuffle<T>(this List<T> toShuffle)
    {
        return toShuffle.OrderBy(x => Guid.NewGuid()).ToList();
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜