Мне потребовалось довольно много времени, чтобы найти правильный ответ, поэтому я решил поделиться:
var xDocument = XDocument.Parse("<xml><a attr=\"b\">c</a></xml>");
var builder = new StringBuilder();
JsonSerializer.Create().Serialize(new CustomJsonWriter(new StringWriter(builder)), xDocument);
var serialized = builder.ToString();
public class CustomJsonWriter : JsonTextWriter
{
public CustomJsonWriter(TextWriter writer): base(writer){}
public override void WritePropertyName(string name)
{
if (name.StartsWith("@") || name.StartsWith("#"))
{
base.WritePropertyName(name.Substring(1));
}
else
{
base.WritePropertyName(name);
}
}
}
Выход:
{"xml":{"a":{"attr":"b","text":"c"}}}
Используйте combn
(правда, не случайно).
n <- 5
out <- combn(n:1, n - 1)
out
# [,1] [,2] [,3] [,4] [,5]
#[1,] 5 5 5 5 4
#[2,] 4 4 4 3 3
#[3,] 3 3 2 2 2
#[4,] 2 1 1 1 1
Перетасуйте каждый столбец, если необходимо
set.seed(1)
apply(combn(n:1, n - 1), 2, sample)
Если вы ищете эффективность, используйте решение, которое я опубликовал;)
library(microbenchmark)
n <- 1000
set.seed(1)
benchmark <- microbenchmark(
akrun = vapply(seq_len(n), function(i) sample(setdiff(seq_len(n), i)), numeric(n-1)),
markus = apply(combn(n:1, n - 1), 2, sample),
A_Stam = create_matrix(n),
times = 30L
)
benchmark
#Unit: milliseconds
# expr min lq mean median uq max neval
# akrun 64.32350 66.99177 73.61685 71.15608 78.79612 104.99161 30
# markus 51.65092 53.01034 59.80802 58.48310 64.76143 78.35348 30
# A_Stam 1331.52882 1379.70371 1470.31044 1407.89861 1548.28011 1896.22913 30
Это может быть не самое элегантное решение, но оно работает:
create_matrix <- function(n) {
m <- c()
for (i in 1:n) {
new <- setdiff(1:n, i)
m <- c(m, new)
}
matrix(m, ncol = n, byrow = FALSE)
}
create_matrix(4)
#> [,1] [,2] [,3] [,4]
#> [1,] 2 1 1 1
#> [2,] 3 3 2 2
#> [3,] 4 4 4 3
Мы перебираем последовательность 'n', получаем sample
последовательности, кроме зацикленного числа (setdiff
)
sapply(seq_len(n), function(i) sample(setdiff(seq_len(n), i)))
# [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] 2 3 1 3 2 2
#[2,] 5 1 5 6 1 5
#[3,] 6 4 6 2 3 4
#[4,] 3 5 4 1 4 1
#[5,] 4 6 2 5 6 3
Это можно сделать немного быстрее, если мы используем vapply
vapply(seq_len(n), function(i) sample(setdiff(seq_len(n), i)), numeric(n-1))
ПРИМЕЧАНИЕ. ФП упомянул матрицу random
в данных поста
n <- 6