Angular по-прежнему советует не использовать трубы для сортировки и фильтрации, как в angularJs.
Это замедлит работу вашего приложения, приведет к проблемам с производительностью. Намного лучше обеспечить сортировку в вашем компоненте, прежде чем передавать его в шаблон.
Причина объяснена на https://angular.io/guide/pipes#no-filter-pipe
Если вы работаете с красивой структурной компоновкой компонентов, вы можете сделать это даже на сеттер:
@Input()
set users(users: Array) {
this.usersResult = (users || []).sort((a: User, b: User) => a.name < b.name ? -1 : 1)
}
Что именно вы имеете в виду под «не должно повторяться»? Если вы имеете в виду, что не хотите получать какие-либо дубликаты, то вам следует взять список чисел 1-20, перемешать их, а затем возьмите по одному из начала списка. Для эффективного способа перемешать список см. этот ответ на переполнение стека .
Если вы просто имеете в виду, что ваша текущая попытка дает 5, 5, 5, 5, 5, 5, 1, 1, 1 , 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 и т. Д., Тогда есть вероятность, что вы создаете новый экземпляр Random
каждый раз, когда выбираете число: не делайте этого который. Каждый раз, когда вы создаете экземпляр, он будет использовать текущее время в качестве «начального числа» для генератора случайных чисел (если вы не укажете его явно). Это означает, что если вы создаете несколько экземпляров в быстрой последовательности, каждый получит одно и то же начальное число и, следовательно, даст одну и ту же последовательность чисел.
Вместо этого используйте один экземпляр Random
и повторно используйте его. (Обратите внимание, что это не потокобезопасный вариант, что очень неприятно.) Например:
private static readonly Random Rng = new Random();
public int NextNumber()
{
return Rng.Next(20) + 1;
}
Это победило ' t быть потокобезопасным, но дайте нам знать, если это проблема. Альтернативой может быть передача Random
в метод (что, конечно, было бы сложнее):
public int NextNumber(Random rng)
{
return rng.Next(20) + 1;
}
тогда вызывающий может повторно использовать экземпляр соответствующим образом.
Если вам нужен поток - безопасный способ генерации случайных чисел, вы можете посмотреть мой класс StaticRandom
в MiscUtil .
(Обратите внимание, что использование rng.Next (1, 21)
тоже будет работать нормально - я предпочитаю версию выше, поскольку я думаю, что она уменьшает количество догадок о включающих / исключающих границах, но это вопрос личного вкуса.)
Этот метод сгенерирует все числа, и никакие числа не будут повторяться:
/// <summary>
/// Returns all numbers, between min and max inclusive, once in a random sequence.
/// </summary>
IEnumerable<int> UniqueRandom(int minInclusive, int maxInclusive)
{
List<int> candidates = new List<int>();
for (int i = minInclusive; i <= maxInclusive; i++)
{
candidates.Add(i);
}
Random rnd = new Random();
while (candidates.Count > 0)
{
int index = rnd.Next(candidates.Count);
yield return candidates[index];
candidates.RemoveAt(index);
}
}
Вы можете использовать это так:
Console.WriteLine("All numbers between 0 and 20 in random order:");
foreach (int i in UniqueRandom(0, 20)) {
Console.WriteLine(i);
}
Из MSDN
«Один из способов улучшить случайность - сделать начальное значение зависящим от времени»
Еще один факт
: вы должны «создать один случайный элемент для генерации множества случайных числа с течением времени ". Это улучшит случайную генерацию
Некоторое время назад я проделал такой путь. Я не знаю, как он сравнивается с другими представленными методами по эффективности, случайности и т.д. Но, похоже, он работает:
List<int> integers = new List<int>() { 1, 2, 3, 4, 5, 6,7, 8, 9, 10, 11, 12 };
Random rnd = new Random();
var ints = from i in integers
orderby rnd.Next(integers.Count)
select i;