Алгоритм:
В C #:
void Main()
{
var set = new [] {"A", "B", "C", "D" }; //, "E", "F", "G", "H", "I", "J" };
var kElement = 2;
for(var i = 1; i < Math.Pow(2, set.Length); i++) {
var result = Convert.ToString(i, 2).PadLeft(set.Length, '0');
var cnt = Regex.Matches(Regex.Escape(result), "1").Count;
if (cnt == kElement) {
for(int j = 0; j < set.Length; j++)
if ( Char.GetNumericValue(result[j]) == 1)
Console.Write(set[j]);
Console.WriteLine();
}
}
}
Почему это работает?
биекция между подмножествами n-элементного множества и n-битовых последовательностей.
Это означает, что мы можем выяснить, сколько подмножеств существует путем подсчета последовательностей.
, например, четыре приведенных ниже элемента могут быть представлены {0,1} X {0, 1} X {0, 1} X {0, 1} (или 2 ^ 4) различными последовательностями.
Итак, все, что нам нужно сделать, это считать от 1 до 2 ^ n, чтобы найти все комбинации. (Мы игнорируем пустое множество.) Затем переведите цифры в их двоичное представление. Затем замените элементы вашего набора на биты «on».
Если вы хотите получить только результаты k-элемента, только распечатывайте, когда k бит «включено».
(Если вы хотите, чтобы все подмножества вместо подмножеств k длины удаляли часть cnt / kElement.)
(Для доказательства см. бесплатную учебную программу MIT Mathematics for Computer Science, Lehman et al. , раздел 11.2.2. https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010/readings/ )
Существует аналогичная проблема, обсуждаемая здесь: Анимация перехода FADE при навигации на страницу Использование техники, описанного там, вы можете скользить \ перемещать свой контроль кадра каждый раз, когда новая страница навигация. Вроде этого:
XAML:
...
<Frame Name = "frame" Navigating="frame_Navigating">
...
код:
...
private bool _allowDirectNavigation = false;
private NavigatingCancelEventArgs _navArgs = null;
private Duration _duration = new Duration(TimeSpan.FromSeconds(1));
private double _oldHeight = 0;
private void frame_Navigating(object sender, NavigatingCancelEventArgs e)
{
if (Content!=null && !_allowDirectNavigation)
{
e.Cancel = true;
_navArgs = e;
_oldHeight = frame.ActualHeight;
DoubleAnimation animation0 = new DoubleAnimation();
animation0.From = frame.ActualHeight;
animation0.To = 0;
animation0.Duration = _duration;
animation0.Completed += SlideCompleted;
frame.BeginAnimation(HeightProperty, animation0);
}
_allowDirectNavigation = false;
}
private void SlideCompleted(object sender, EventArgs e)
{
_allowDirectNavigation = true;
switch (_navArgs.NavigationMode)
{
case NavigationMode.New:
if (_navArgs.Uri == null)
frame.Navigate(_navArgs.Content);
else
frame.Navigate(_navArgs.Uri);
break;
case NavigationMode.Back:
frame.GoBack();
break;
case NavigationMode.Forward:
frame.GoForward();
break;
case NavigationMode.Refresh:
frame.Refresh();
break;
}
Dispatcher.BeginInvoke(DispatcherPriority.Loaded,
(ThreadStart)delegate()
{
DoubleAnimation animation0 = new DoubleAnimation();
animation0.From = 0;
animation0.To = _oldHeight;
animation0.Duration = _duration;
frame.BeginAnimation(HeightProperty, animation0);
});
}
...
Надеюсь, это поможет, считает
Возможно, это не лучший ответ, но он может быть полезен для вас или, по крайней мере, дать вам некоторые идеи. В Silverlight я добился такого типа эффекта скользящего перехода между страницами, используя TransitioningContentControl из Silverlight Toolkit. Это управление содержимым, которое, по сути, позволяет вам определить пользовательский раскадровку в визуальном состоянии для перехода между старым и новым содержимым при каждом его изменении. Он также включает некоторые переходы по умолчанию (fade/up/down), если вы не хотите тратить время на определение пользовательского раскадровки.
Я понимаю, что вы работаете с WPF и что TransitioningContentControl недоступен в WPF или в WPF Toolkit. Однако, может быть не слишком сложно перенести это управление в WPF или, по крайней мере, сделать что-то подобное. Оглядываясь на источник, можно подумать, что это можно сделать, если у вас есть время, и именно этот тип управления вы можете использовать в других местах.
Исходный код здесь для версии Silverlight, а у Джесси Либерти есть хорошее учебное пособие , которое проходит через использование элемента управления в Silverlight.