В настоящий момент я немного разбираюсь в коде, и я понимаю концепцию, но я не уверен, как бы я выразился в LINQ-to -объекты.Linq проверяет, есть ли у всех коллекций хотя бы один общий элемент.
Сценарий у меня есть это:
Дерево с иерархическими данными, в результате чего некоторые элементы может быть перемещены с помощью перетаскивания для других родительских элементов.
Я хочу поддержать несколько элементов тащат, пример дерева выглядит следующим образом:
- Период
- Instance
- Период
- Instance
Каждый вид элементов модели в иерархии происходит от базового типа, на котором я обнажая в IReadOnlyList<Type>
, которая гласит, какие типы иерархии каждая иерархия элемент счастлив быть переведен как ребенок.
На мероприятии PreviewDragEnter
Я уже проверяю, что каждый перетаскиваемый элемент фактически поддерживает перемещение.
Проблема, которую я действительно хочу решить, - это проверить каждый из этих списков только для чтения по крайней мере для одного типа, чтобы я мог быть уверен, что каждый перемещаемый элемент может быть перенесен на одну и ту же цель.
Я понимаю, что проверка 1-1 .Any()
может быть выполнена, если я собираюсь из одной коллекции в другую, но как это сделать для произвольного числа?
У меня есть что-то вроде этого до сих пор, но я не уверен, что это правильно, и это, конечно, не выглядит оптимальным:
private void RadTreeView_PreviewDragStarted(object sender, Telerik.Windows.Controls.RadTreeViewDragEventArgs e)
{
var items = e.DraggedItems.Cast<HierarchyItemViewModel>();
// Every item being dragged must support being dragged
if (items.Any(i => i.ValidReorgTargets.Count == 0))
{
e.Handled = true;
return;
}
if (items.All(i => HasOneTypeInCommonWithOthers(i, items.Except(new[] { i }))))
{
e.Handled = true;
return;
}
}
private bool HasOneTypeInCommonWithOthers(HierarchyItemViewModel item, IEnumerable<HierarchyItemViewModel> others)
{
return others.All(i => i.ValidReorgTargets.Intersect(item.ValidReorgTargets).Any());
}
Все лучше, чем это было бы весьма признателен.