Вы можете взять массив для нужных ключей и отобразить значение. Позже возьмите деструктурирующее задание для получения одного id
.
const
transpose = array => array.reduce((r, a) => a.map((v, i) => [...(r[i] || []), v]), []),
array = [{ fromX: { id: 1 }, toX: { id: 2 } }, { fromX: { id: 3 }, toX: { id: 4 } }],
keys = ['fromX', 'toX'],
[fromX, toX] = transpose(array.map(o => keys.map(k => o[k].id)));
console.log(fromX);
console.log(toX);
Создайте компаратор:
Public Class Randomizer(Of T)
Implements IComparer(Of T)
''// Ensures different instances are sorted in different orders
Private Shared Salter As New Random() ''// only as random as your seed
Private Salt As Integer
Public Sub New()
Salt = Salter.Next(Integer.MinValue, Integer.MaxValue)
End Sub
Private Shared sha As New SHA1CryptoServiceProvider()
Private Function HashNSalt(ByVal x As Integer) As Integer
Dim b() As Byte = sha.ComputeHash(BitConverter.GetBytes(x))
Dim r As Integer = 0
For i As Integer = 0 To b.Length - 1 Step 4
r = r Xor BitConverter.ToInt32(b, i)
Next
Return r Xor Salt
End Function
Public Function Compare(x As T, y As T) As Integer _
Implements IComparer(Of T).Compare
Return HashNSalt(x.GetHashCode()).CompareTo(HashNSalt(y.GetHashCode()))
End Function
End Class
Используйте его как это, предполагая значение дженерика List(Of FileInfo)
:
list.Sort(New Randomizer(Of IO.FileInfo)())
Можно также использовать закрытие, чтобы сделать случайное значение 'липким' и затем просто использовать.OrderBy linq () на том (C# на этот раз, потому что синтаксис лямбды VB ужасен):
list = list.OrderBy(a => Guid.NewGuid()).ToList();
Объясненный здесь, наряду с тем, почему это даже не могло бы быть с такой скоростью, как реальная перестановка:
http://www.codinghorror.com/blog/archives/001008.html?r=31644
Проверьте алгоритм перестановки Фишера-Йетса здесь: http://en.wikipedia.org/wiki/Knuth_shuffle
с более кратким обсуждением главным повелителем этого сайта здесь: http://www.codinghorror.com/blog/archives/001015.html
Существует простая реализация C# в записи в блоге, которую должно быть очень легко изменить на VB.NET
Вы могли также реализовать перестановку, много способов сделать это, самым простым является случайным образом выбор объект, и вставьте его в новое местоположение набор времен.
Существует несколько разумных методов перестановки.
Каждый был уже упомянут. (Перестановка Knuth.)
Другой метод должен был бы присвоить "вес" каждому элементу и отсортировать список согласно тому "весу". Этот метод является возможным, но был бы громоздким, потому что Вы не можете наследоваться FileInfo.
Один последний метод состоял бы в том, чтобы случайным образом выбрать элемент в исходном списке и добавить его к новому списку. Конечно, то есть, если Вы не возражаете создавать новый список. (Не протестировали этот код...),
Dim rnd As New Random
Dim lstOriginal As New List(Of FileInfo)
Dim lstNew As New List(Of FileInfo)
While lstOriginal.Count > 0
Dim idx As Integer = rnd.Next(0, lstOriginal.Count - 1)
lstNew.Add(lstOriginal(idx))
lstOriginal.RemoveAt(idx)
End While
Если у Вас есть число элементов затем, псевдослучайный метод может использоваться, посредством чего Вы выбираете первый элемент наугад (например, использование встроенной функции случайного числа) затем добавляют начало и берут остаток после деления количеством значений. например, для списка 10 Вы могли сделать меня = (я + главный) % 10 к сгенерированным индексам i от некоторого начального значения. Пока начало больше, чем количество значений в списке затем, Вы создаете последовательность, которая пробегает все числа 0... n, где n является количеством значений - 1, но в псевдослучайном порядке.
Dim oRand As New Random() 'do not seed!!!!
Private Sub GetRandom(ByRef currentVals As List(Of Integer))
Dim i As New List(Of Integer), j As Integer
For x As Integer = 0 To currentVals.Count - 1
j = oRand.Next(0, currentVals.Count)
i.Add(currentVals(j))
currentVals.RemoveAt(j)
Next
currentVals = i
End Sub
Вы могли создать пользовательский компаратор, который просто возвращает случайное число, затем отсортируйте список с помощью этого компаратора. Это могло быть ужасно неэффективно и вызвать почти бесконечный цикл, но могло бы стоить попытки.