В духе оригинального вопроса:
Я бы хотел сравнить два массива ... идеально, эффективно.
blockquote>Я выполнял тесты производительности на некоторые из более простых предложений, предложенных здесь, со следующими результатами (быстрый до медленного):
, а (67%) - Tim Down
var i = a1.length; while (i--) { if (a1[i] !== a2[i]) return false; } return true
каждый (69 %) пользователем2782196
a1.every((v,i)=> v === a2[i]);
уменьшить (74%) с помощью DEI
a1.reduce((a, b) => a && a2.includes(b), true);
join & amp; toString (78%) Gaizka Allende & amp; vivek
a1.join('') === a2.join(''); a1.toString() === a2.toString();
half toString (90%) от Victor Palomo
a1 == a2.toString();
stringify (100%) на radtek
JSON.stringify(a1) === JSON.stringify(a2);
Обратите внимание, что приведенные ниже примеры предполагают, что массивы отсортированы, одномерные массивы. Сравнение
.length
было удалено для общего теста (добавьтеa1.length === a2.length
к любому из предложений, и вы получите повышение производительности на 10%). Выберите любые решения, которые лучше всего подходят для вас, зная скорость и ограничение каждого из них.Несвязанное примечание: интересно видеть, как люди получают все триггер-счастливые Джон Уэйнс при снижении голосов на вполне законные ответы на этот вопрос.
blockquote>
Никто еще никто не упомянул очевидный и тривиальный способ укладывать буквы произвольной струны вертикально (не вращая их) с помощью чистого XAML:
<ItemsControl
ItemsSource="Text goes here, or you could use a binding to a string" />
это просто отказывается от текста вертикально, распознавая тот факт, что строка является iEnumerable И поэтому itemsControl может относиться к каждому символу в строке как отдельный элемент. Панель по умолчанию для itemsControl - это StackPanel, поэтому символы выложены вертикально.
Примечание. Для точного контроля над горизонтальным расположением, вертикальным расстоянием и т. Д., ItemContainerStyle и ItemTemplate Properties могут быть установлены на элементахControl.
Это выполнимо:
Ваш TextBlock
TextAlignment
свойство должно быть установлено на Center
:
<TextBlock Name="textBlock1" TextAlignment="Center" Text="Stacked!" />
Тогда добавляют NewLine
с между каждым символом:
textBlock1.Text =
String.Join(
Environment.NewLine,
textBlock1.Text.Select(c => new String(c, 1)).ToArray());
(Использование System.Linq
для создания массива строк из отдельных символов в исходной строке. Я уверен, что существуют другие способы сделать это...)
Вот способ вставить '\n' после каждого символа в тексте TextBlock, тот способ заставить его отобразиться вертикально:
<TextBlock x:Name="VertTextBlock" Text="Vertical Text" Loaded="VertTextBlock_Loaded"></TextBlock>
Затем в Загруженном обработчике событий, Вы говорите:
TextBlock tb = sender as TextBlock;
StringBuilder sb = new StringBuilder(tb.Text);
int len = tb.Text.Length * 2;
for (int i = 1; i < len; i += 2)
{
sb.Insert(i, '\n');
}
tb.Text = sb.ToString();
, Что решение было предложено Lette, но я верю, моя реализация подвергается меньше служебному.
Я не думаю, что существует простое из выполнения этого withought изменение путем системы по сути laysout текст. Самое легкое решение состояло бы в том, чтобы изменить ширину textblock и предоставить несколько дополнительных свойств как это:
<TextBlock TextAlignment="Center" FontSize="14" FontWeight="Bold" Width="10" TextWrapping="Wrap">THIS IS A TEST</TextBlock>
Это - hacky, но он действительно работает.
На всякий случай, если кто-нибудь все еще наткнутся на этот пост ... вот простое 100% XAML-решение.
<TabControl TabStripPlacement="Left">
<TabItem Header="Tab 1">
<TabItem.LayoutTransform>
<RotateTransform Angle="-90"></RotateTransform>
</TabItem.LayoutTransform>
<TextBlock> Some Text for tab 1</TextBlock>
</TabItem>
<TabItem Header="Tab 2">
<TabItem.LayoutTransform>
<RotateTransform Angle="-90"></RotateTransform>
</TabItem.LayoutTransform>
<TextBlock> Some Text for tab 2</TextBlock>
</TabItem>
</TabControl>