首页 > 解决方案 > 平面视图模型不正确的输出

问题描述

这个模型我想平成一个视图模型,但当前输出不正确,它将所有 ChildProductId 设置为最后一个值。我正在创建一个List<SubscriptionViewModel>,然后创建多个 SubscriptionViewModel并添加到集合中。

    List<Subscription> ListOfSubscriptions = new List<Subscription>();
    List<SubscriptionChild> SubscriptionChild = new List<SubscriptionChild>();
    SubscriptionChild.Add(new SubscriptionChild() { ChildProductId = 1, ChildProductName = "Child 1" });
    SubscriptionChild.Add(new SubscriptionChild() { ChildProductId = 2, ChildProductName = "Child 2" });
    ListOfSubscriptions.Add(new Subscription() { SubscriptionId = 1, ParentProductId=1, ParentProductName = "Product 1",ListOfSubscriptionChild= SubscriptionChild });
    SubscriptionChild.Clear();
    ListOfSubscriptions.Add(new Subscription() { SubscriptionId = 2, ParentProductId = 2, ParentProductName = "Product 2"});
    SubscriptionChild.Clear();
    SubscriptionChild.Add(new SubscriptionChild() { ChildProductId = 3, ChildProductName = "Child 3" });
    SubscriptionChild.Add(new SubscriptionChild() { ChildProductId = 4, ChildProductName = "Child 4" });
    ListOfSubscriptions.Add(new Subscription() { SubscriptionId = 3, ParentProductId = 3, ParentProductName = "Product 3", ListOfSubscriptionChild = SubscriptionChild });


    List<SubscriptionViewModel> SubscriptionViewModel = new List<SubscriptionViewModel>();
    foreach (var Subscription in ListOfSubscriptions)
    {
        SubscriptionViewModel vm = new SubscriptionViewModel();
        vm.SubscriptionId = Subscription.SubscriptionId;
        vm.ParentProductId = Subscription.ParentProductId;
        vm.ParentProductName = Subscription.ParentProductName;
        int count = Subscription.ListOfSubscriptionChild == null ? 0 : Subscription.ListOfSubscriptionChild.Count;

       if (count == 0) {
            SubscriptionViewModel.Add(vm);
        }
        else
        {
            var listOfChild = Subscription.ListOfSubscriptionChild.ToList();
            foreach (var item in listOfChild)
            {
                vm.ChildProductId = item.ChildProductId;
                vm.ChildProductName = item.ChildProductName;
                SubscriptionViewModel.Add(vm);
            }
        }
    }
    foreach (var item in SubscriptionViewModel)
    {
        Console.WriteLine(string.Format("SubscriptionId{0} ParentProductId-{1} ChildProductId-{2}", item.SubscriptionId, item.ParentProductId, item.ChildProductId));

    }

class Subscription
{
    public int SubscriptionId { get; set; }
    public int ParentProductId { get; set; }
    public string ParentProductName { get; set; }
    public List<SubscriptionChild> ListOfSubscriptionChild { get; set; }
}
class SubscriptionChild
{
    public string ChildProductName { get; set; }
    public int ChildProductId { get; set; }
}
class SubscriptionViewModel
{
    public int SubscriptionId { get; set; }
    public int ParentProductId { get; set; }
    public string ParentProductName { get; set; }
    public string ChildProductName { get; set; }
    public int ChildProductId { get; set; }
}

Current Output
    SubscriptionId1 ParentProductId-1 ChildProductId-4
    SubscriptionId1 ParentProductId-1 ChildProductId-4
    SubscriptionId2 ParentProductId-2 ChildProductId-0
    SubscriptionId3 ParentProductId-3 ChildProductId-4
    SubscriptionId3 ParentProductId-3 ChildProductId-4

expected outcome
    SubscriptionId1 ParentProductId-1 ChildProductId-1
    SubscriptionId1 ParentProductId-1 ChildProductId-2
    SubscriptionId2 ParentProductId-2 ChildProductId-0
    SubscriptionId3 ParentProductId-3 ChildProductId-3
    SubscriptionId3 ParentProductId-3 ChildProductId-4

标签: c#

解决方案


你正在SubscriptionViewModel为你所有的孩子覆盖你的。您需要为每个孩子创建一个新的:

foreach (var Subscription in ListOfSubscriptions)
{
    int count = Subscription.ListOfSubscriptionChild == null ? 0 : Subscription.ListOfSubscriptionChild.Count;

    if (count == 0) 
    {
        SubscriptionViewModel vm = new SubscriptionViewModel();
        vm.SubscriptionId = Subscription.SubscriptionId;
        vm.ParentProductId = Subscription.ParentProductId;
        vm.ParentProductName = Subscription.ParentProductName;

        SubscriptionViewModel.Add(vm);
    }
    else
    {
        var listOfChild = Subscription.ListOfSubscriptionChild.ToList();
        foreach (var item in listOfChild)
        {
            // Instantiate a new model for each child
            SubscriptionViewModel vm = new SubscriptionViewModel();
            vm.SubscriptionId = Subscription.SubscriptionId;
            vm.ParentProductId = Subscription.ParentProductId;
            vm.ParentProductName = Subscription.ParentProductName;
    
            vm.ChildProductId = item.ChildProductId;
            vm.ChildProductName = item.ChildProductName;

            SubscriptionViewModel.Add(vm);
        }
    }
}

推荐阅读