Класс <type>в C # - PullRequest
       44

Класс <type>в C #

2 голосов
/ 18 мая 2011

У меня есть класс, и я хочу работать с ним как со списками: например, List<int>, List<string>, ... , List<T> У меня есть класс Randomizor, который будет принимать тип данных коллекции, который будет перемешиваться.Как я могу это сделать?

class Randomizor<T>
{
    public Randomizor()
    {

    }

    public Array Shuffle(Array toShuffle)
    {

    }
}

Ответы [ 6 ]

3 голосов
/ 18 мая 2011

Создайте общий класс примерно так:

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

Или вот так:

class Randomizer<T>
{
    public IList<T> Randomize(IList<T> list)
    {
        // ...
    }
}
2 голосов
/ 18 мая 2011

Не очень понятный вопрос ... Вы имеете в виду что-то подобное?

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

      return value;
   }
}
1 голос
/ 18 мая 2011

РЕДАКТИРОВАТЬ: я обнаружил две превосходные имплементации после небольшого копания, поэтому я бы предложил те, которые предпочтительнее.

Метод расширения для этой цели и уже был предложен ранее здесь Я включил код, перефразированный в Shuffle ниже.

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];
    }
}

И интересное решение, адаптированное из этого подхода linq

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

Оригинальный ответ, но медленнее, чем правки

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);
    }
} 

Если вам нравится один из них, вам следует проголосовать за связанный ответ.

Если вы очень обеспокоены случайностьюВы можете перейти на один из алгоритмов RNG из Crypto API и заполнить его каким-нибудь недетерминированным значением, например, чем-то, сгенерированным в результате недавней активности мыши.Я подозреваю, что это было бы излишним, и это ухудшило бы производительность.

1 голос
/ 18 мая 2011
class Randomizer<T>
{
    public Randomizer(ICollection<T> collection)
    {
        //Do something with collection using T as the type of the elements
    }            
}

Однако вы можете использовать общий метод расширения

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

и использование:

List<int> list = new List<int> { 1, 2, 3, 4, 5 };
list.Randomize();
1 голос
/ 18 мая 2011
class Randomizor<T>
{
    public Randomizor()
    {

    }

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

    }
}
0 голосов
/ 18 мая 2011

Может быть так:

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

Или как метод расширения

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