组合两个不同结果集并进行迭代和求和的各种方法

时间:2018-03-13 18:26:16

标签: c# list linq c#-4.0 generic-list

这里我有一个班级List1和班级List2ListViewModel用于组合两个数据集,我有两个不同的结果集,每个列表都有四个值,我需要将它们组合起来作为具有4行的单个结果集,需要使用即将到来的结果集中的结果值进行迭代和求和。

我尝试过两种方式:

方法1:

var list1 = List1.GetList1();
var list2 = List2.GetList12();
List<ListViewModel> listViewmodelCollection = new List<ListViewModel>();
ListViewModel listViewmodelInstance = new ListViewModel();


foreach (var _list1 in list1)
{
    listViewmodelInstance.LocationValues1 = _list1.LocationValues1;
    listViewmodelInstance.LocationValues2 = _list1.LocationValues2;

    foreach (var _list2 in list2)
    {
        listViewmodelInstance.LocationValues5 = _list2.LocationValues5;
        listViewmodelInstance.LocationValues4 = _list2.LocationValues4;
        listViewmodelInstance.RA = _list1.LocationValues1 + _list2.LocationValues4;
        listViewmodelCollection.Add(listViewmodelInstance);

    }
}

方法2:

List<ListViewModel> listViewmodelCollection = new List<ListViewModel>();
ListViewModel  listViewmodelInstance = new ListViewModel();
var x = (from listobj in m.list
         from n in m.list2
         select new list4
         {

             LocationValues1 = listobj.LocationValues1,
             LocationValues2 = n.LocationValues4,
             LocationValues4 = listobj.LocationValues1 + n.LocationValues4
         });

- 完成 -

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace simple
{
    class Program
    {
        public class List2
        {
            public string ContinentName { get; set; }
            public decimal LocationValues4 { get; set; }
            public decimal LocationValues5 { get; set; }
            public Nullable<System.DateTimeOffset> CreatedDate { get; set; }

            public static List<List2> GetList12()
            {
                var list2 = new List<List2>
                {
                    new List2{ ContinentName="Asia",LocationValues4=399.23M,LocationValues5=22.90M  },
                    new List2 { ContinentName ="Africa",LocationValues4=199.23M,LocationValues5=22.90M },
                    new List2 { ContinentName ="Australia",LocationValues4=199.23M,LocationValues5=22.90M },
                    new List2 { ContinentName ="Pakistan",LocationValues4=199.23M,LocationValues5=22.90M },
                };

                return list2;
            }
        }


        public class List1
        {
            public string LocationName { get; set; }
            public decimal LocationValues1 { get; set; }
            public decimal LocationValues2 { get; set; }
            public Nullable<System.DateTimeOffset> CreatedDate { get; set; }



            public static List<List1> GetList1()
            {
                var list1 = new List<List1>
                {
                    new List1 {LocationName="Africa",LocationValues1=199.23M,LocationValues2=22.90M },
                    new List1 {LocationName="Africa",LocationValues1=299.23M,LocationValues2=24.90M },
                    new List1 {LocationName="Africa",LocationValues1=399.23M,LocationValues2=25.90M },
                    new List1 {LocationName="Africa",LocationValues1=499.23M,LocationValues2=26.90M },
                };

                return list1;
            }
        }

        public class ListViewModel
        {
            public string LocationName { get; set; }
            public decimal LocationValues1 { get; set; }
            public decimal LocationValues2 { get; set; }
            public Nullable<System.DateTimeOffset> LocationCreatedDate { get; set; }

            public decimal RA { get; set; }

            public string ContinentName { get; set; }
            public decimal LocationValues4 { get; set; }
            public decimal LocationValues5 { get; set; }

            public Nullable<System.DateTimeOffset> ContinentCreatedDate { get; set; }

        }


        static void Main(string[] args)
        {
            var list1 = List1.GetList1();
            var list2 = List2.GetList12();
            List<ListViewModel> listViewmodelCollection = new List<ListViewModel>();
            ListViewModel listViewmodelInstance = new ListViewModel();


            foreach (var _list1 in list1)
            {
                listViewmodelInstance.LocationValues1 = _list1.LocationValues1;
                listViewmodelInstance.LocationValues2 = _list1.LocationValues2;

                foreach (var _list2 in list2)
                {
                    listViewmodelInstance.LocationValues5 = _list2.LocationValues5;
                    listViewmodelInstance.LocationValues4 = _list2.LocationValues4;
                    listViewmodelInstance.RA = _list1.LocationValues1 + _list2.LocationValues4;
                    listViewmodelCollection.Add(listViewmodelInstance);

                }
            }
        }

预期产出:     4行

LocationName="Africa",LocationValues1=199.23M,LocationValues2=22.90M,ContinentName="Asia",LocationValues4=399.23M,LocationValues5=22.90M, RA=598.46
LocationName="Africa",LocationValues1=299.23M,LocationValues2=24.90M ,ContinentName ="Africa",LocationValues4=199.23M,LocationValues5=22.90M,RA=465.46
LocationName="Africa",LocationValues1=399.23M,LocationValues2=25.90M ContinentName ="Australia",LocationValues4=199.23M,LocationValues5=22.90M,RA=598.46
LocationName="Africa",LocationValues1=499.23M,LocationValues2=26.90M , ContinentName ="Pakistan",LocationValues4=199.23M,LocationValues5=22.90M.RA=698.46

但目前的输出:

enter image description here

2 个答案:

答案 0 :(得分:1)

所以,这似乎充其量是凌乱的。我不确定你的情况是什么,但我会非常担心编码合并2个不同的数据列表并期望它们总是等长等等。

我强烈建议您为两个列表添加一个接口,这样您至少可以将它们转换为基础对象,并以这种方式使用它们。

那就是说我会尝试从第一组中通过linq选择视图模型属性,然后迭代以添加第二组中的数据然后进行计算。

示例:

    var list1 = List1.GetList1();
    var list2 = List2.GetList12();
    List<ListViewModel> listViewmodelCollection = new List<ListViewModel>();
    ListViewModel listViewmodelInstance = new ListViewModel();

    listViewmodelCollection.AddRange(list1.Select(l => new ListViewModel()
    {
        LocationName = l.LocationName,
        LocationCreatedDate = l.CreatedDate,
        LocationValues1 = l.LocationValues1,
        LocationValues2 = l.LocationValues2
    }));
    for (int i = 0; i < (listViewmodelCollection.Count - 1); i++)
    {
        var itm2 = list2.ElementAt(i);
        if (itm2 != null)
        {
            listViewmodelCollection[i].ContinentName = itm2.ContinentName;
            listViewmodelCollection[i].ContinentCreatedDate = itm2.CreatedDate;
            listViewmodelCollection[i].LocationValues4 = itm2.LocationValues4;
            listViewmodelCollection[i].LocationValues5 = itm2.LocationValues5;
            listViewmodelCollection[i].RA = listViewmodelCollection[i].LocationValues1 + itm2.LocationValues4;
        }
    }

鉴于你的课程,这应该让你得到你想要的输出,至少对于这个狭窄的例子。

答案 1 :(得分:0)

您可以使用LINQ使用List扩展方法合并两个Zip

var listViewmodelCollection = list1.Zip(list2, (l1, l2) => new ListViewModel {
    LocationName = l1.LocationName,
    LocationValues1 = l1.LocationValues1,
    LocationValues2 = l1.LocationValues2,
    ContinentName = l2.ContinentName,
    LocationValues4 = l2.LocationValues4,
    LocationValues5 = l2.LocationValues5,
    RA = l1.LocationValues1+l2.LocationValues4
}).ToList();