Вот ответ на вторую часть вопроса. Если у вас есть IntStream
в результате вызова string.chars()
, вы можете получить Stream
, выполнив кастинг на char
, а затем боксируя результат, вызвав mapToObj
. Например, вот как превратить String
в Set
:
Set set = string.chars()
.mapToObj(ch -> (char)ch)
.collect(Collectors.toSet());
Обратите внимание, что приведение к char
важно, чтобы результат в блоке был Character
вместо Integer
.
. Теперь большая проблема с обработкой данных char
или Character
заключается в том, что дополнительные символы представлены как суррогатные пары значений char
, поэтому любой алгоритм с сделками с отдельными char
значениями, вероятно, не удастся при представлении дополнительных символов.
(Может показаться, что дополнительные символы - это неясная функция Юникода, о которой нам не нужно беспокоиться, но насколько я знаю , все emoji являются дополнительными символами.)
Рассмотрим этот пример:
string.chars()
.filter(Character::isAlphabetic)
...
Это приведет к сбою, если будет представлена строка, содержащая кодовую точку U + 1D400 (Математическая полужирная капитализация A ). Эта кодовая точка представляется в виде суррогатной пары в строке, и ни значение суррогатной пары не является буквенным символом. Чтобы получить правильный результат, вам нужно будет сделать это:
string.codePoints()
.filter(Character::isAlphabetic)
...
Я рекомендую всегда использовать codePoints()
.
Теперь, учитывая IntStream
кодовых точек , как можно собрать его в строку? Ответ Sleiman Jneidi является разумным (+1), используя метод tr-arg collect()
IntStream
.
Вот альтернатива:
StringBuilder sb = ... ;
string.codePoints()
.filter(...)
.forEachOrdered(sb::appendCodePoint);
return sb.toString();
Это может быть немного более гибким, если у вас уже есть StringBuilder
, который вы используете для накопления строковых данных. Вам не нужно создавать новый StringBuilder
каждый раз, и вам не нужно впоследствии преобразовывать его в String
.
просто свяжите свой Список с Вашим TabControl как ItemsSource, например,
<TabControl ItemsSource="{Binding Customers}"/>
это даст Вам вкладку для каждого объекта в клиенте.
Ваш ответ может быть найден здесь.
http://www.codeplex.com/smartclient/Thread/View.aspx?ThreadId=31821
Уведомление, как он устанавливает ContentTemplate, а также ItemTemplate... Вы почти, имело его!
boost:: функция выглядит здесь как идеальная посадка.
-121--3311480-Для этого можно использовать чистый Python:
import json
list = [1, 2, (3, 4)] # Note that the 3rd element is a tuple (3, 4)
json.dumps(list) # '[1, 2, [3, 4]]'
-121--1173078- Я нашел решение здесь:
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/956eaba3-53bd-4683-b3dd-28b20e4b7526/
Это сработало на меня.
Вот что я бы сделал
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//create all
var customers = new List<Customer>{
new Customer {FirstName = "Jim", LastName = "Smith", NumberOfContracts = 23},
new Customer {FirstName = "Jane", LastName = "Smith", NumberOfContracts = 23},
new Customer {FirstName = "John", LastName = "Tester", NumberOfContracts = 23}};
//show
TheTabControl.ItemsSource = customers;
TheTabControl.SelectedIndex = 0;
}
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int NumberOfContracts { get; set; }
}
И на стороне XAML
<TabControl x:Name="TheTabControl">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock Text="{Binding FirstName}"/> <TextBlock Text="{Binding LastName}"/>
</TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBlock>
This is <TextBlock Text="{Binding FirstName}"/> <TextBlock Text="{Binding LastName}"/>
</TextBlock>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>