3 回答

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
解決了:
使用以下代碼:
public static class TraversalHelper
{
public static void TraverseAndExecute<T>(this T composite, Func<T, IEnumerable<T>> selectChildren, Action<T> action)
where T : class
{
action.Invoke(composite);
composite.TraverseAndExecute(selectChildren, action, new List<T> { composite });
}
private static void TraverseAndExecute<T>(this T composite, Func<T, IEnumerable<T>> selectChildren, Action<T> action, IList<T> invokedComponents)
where T : class
{
invokedComponents = invokedComponents ?? new List<T>();
var components = selectChildren(composite) ?? new T[] { };
foreach (var component in components)
{
if (!invokedComponents.Contains(component))
{
action.Invoke(component);
invokedComponents.Add(component);
component.TraverseAndExecute(selectChildren, action, invokedComponents);
}
else
{
}
}
}
}
我設(shè)法迭代我的分層對(duì)象:
var vm = new MessageViewModel
{
Messages = new List<MessageViewModel> {
new MessageViewModel {
IsSelected = true,
Messages = new List<MessageViewModel> {
new MessageViewModel {
IsSelected = true,
Messages = new List<MessageViewModel> {
new MessageViewModel { },
new MessageViewModel { },
new MessageViewModel { } } } } } }
};
var results = new List<DestinationClass>();
vm.TraverseAndExecute(_ => _.Messages, _ => {
if(_.IsSelected == true)
{
results.Add(new DestinationClass { Subject = _.Subject });
}
});

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
由于您的類是嵌套層次結(jié)構(gòu),因此您需要一個(gè)擴(kuò)展方法。
具有更多 LINQ 特征的一個(gè)將是:
public static IEnumerable<T> Flatten<T>(this T current, Func<T, IEnumerable<T>> childrenFn) {
var working = new Stack<T>();
working.Push(current);
while (working.Count > 0) {
current = working.Pop();
yield return current;
if (childrenFn(current) != null)
foreach (var child in childrenFn(current))
working.Push(child);
}
}
這需要一個(gè)父對(duì)象和一個(gè)函數(shù),該函數(shù)從父對(duì)象返回子對(duì)象列表并返回所有扁平化的對(duì)象。
現(xiàn)在您可以使用它來生成您的答案:
var ans = vm.Flatten(mvm => mvm.Messages)
.Where(mvm => mvm.IsSelected)
.Select(mvm => new DestinationClass() { Subject = mvm.Subject });

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
在這種情況下,我將使用 Message ViewModel 的 IEnumerable 作為 DestinationClass 中的構(gòu)造函數(shù)參數(shù)。然后,您可以使用 System.Linq 遍歷 MessageViewModels 集合并選擇條件為真的每個(gè)模型并將其轉(zhuǎn)換為 DestinationClass 的 IEnumerable。
這只是您解決此問題的一種方法。如果您可以向我們提供有關(guān)您的解決方案架構(gòu)的更多詳細(xì)信息,我們將更容易為您提供支持。問候 EnvyIT
- 3 回答
- 0 關(guān)注
- 136 瀏覽
添加回答
舉報(bào)