第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

根據(jù)屬性值從嵌套對(duì)象中提取對(duì)象并投影到新類

根據(jù)屬性值從嵌套對(duì)象中提取對(duì)象并投影到新類

C#
BIG陽 2021-06-25 18:32:58
我有以下嵌套輸入類 //InputClasspublic class MessageViewModel {    public bool IsSelected { get; set; }    public string Subject { get; set; }    public DateTime CreationDate { get; set; }    public List<MessageViewModel> Messages { get; set; }}我想創(chuàng)建以下類型的新實(shí)例: //Target Classpublic class DestinationClass{    public string Subject { get; set; }}對(duì)于每個(gè)具有 IsSelected = true 屬性的 MessageViewModel 實(shí)例,在這種情況下最好的解決方案是什么?這可以使用 AutoMapper 實(shí)現(xiàn)嗎?編輯:假設(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 { } } } } } }        };我想遍歷它并僅提取和映射 IsSelected 等于 true 的 MessageViewModels。
查看完整描述

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 });

            }

        });


查看完整回答
反對(duì) 回復(fù) 2021-06-27
?
小怪獸愛吃肉

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 });


查看完整回答
反對(duì) 回復(fù) 2021-06-27
?
臨摹微笑

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


查看完整回答
反對(duì) 回復(fù) 2021-06-27
  • 3 回答
  • 0 關(guān)注
  • 136 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)