合并对象数组列表c#

时间:2017-02-13 12:31:01

标签: c# linq

我有来自不同来源(文件,sql,webservices)的对象数组(List<object[]> a)列表,我需要一种方法来加入它们。 例如,我有两个列表:

        List<object[]> listA = new List<object[]>();
        object[] a = new object[] { 1, "A", 1200, "2016-12-31" };
        listA.Add(a);
        a = new object[] { 2, "B", 5200, "2016-12-31" };
        listA.Add(a);
        a = new object[] { 3, "C", 3500, "2016-12-31" };
        listA.Add(a);
        a = new object[] { 4, "D", 100, "2016-12-31" };
        listA.Add(a);

        List<object[]> listB = new List<object[]>();
        object[] b = new object[] { 44,  859, "2016-12-08" };
        listB.Add(b);
        b = new object[] { 23, 851, "2016-12-07" };
        listB.Add(b);
        b = new object[] { 31, 785, "2016-12-09" };
        listB.Add(b);

结果将是这一个:

        List<object[]> listC = new List<object[]>();
        object[] c = new object[] { 1, "A", 1200+859, 44, "2016-12-08" };
        listC.Add(c);
        c = new object[] { 2, "B", 5200+851, 23,  "2016-12-07" };
        listC.Add(c);
        c = new object[] { 3, "C", 3500+785, 31, "2016-12-09" };
        listC.Add(c);
        c = new object[] { 4, "D", 100, null, null };
        listC.Add(c);

列表比示例中的更大,我必须配置如何合并然后如果我发现在linq中执行此操作的方法是一半的方式。 有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用listA中的左侧项目压缩两个序列并连接:

listA.Zip(listB, (a, b) => 
         new object[] { a[0], a[1], (int)a[2] + (int)b[1], b[0], b[2] })
     .Concat(listA.Skip(listB.Count).Select(a => 
         new object[] { a[0], a[1], a[2], null, null }))

您还可以使用群组联接或按第一个列表中的项目索引从第二个列表中选择项目。

我还建议您使用自定义类而不是对象数组来使代码更具可读性,获得良好的类型检查,描述性属性和智能感知。 E.g。

public class Foo
{
   public int Id { get; set; }
   public string Name { get; set; }
   public int Value { get; set; }
   public DateTime Date { get; set; }
}

并且

public class Bar
{
   public int Id { get; set; }
   public int Value { get; set; }
   public DateTime Date { get; set; }
}

当然你应该在这里使用更合适的名字。现在你的代码看起来像

List<Foo> foos = new List<Foo> {
   new Foo { Id=1, Name="A", Value=1200, Date=new DateTime(2016,12,31) },
   new Foo { Id=2, Name="B", Value=5200, Date=new DateTime(2016,12,31) },
   new Foo { Id=3, Name="C", Value=3500, Date=new DateTime(2016,12,31) },
   new Foo { Id=4, Name="D", Value=100, Date=new DateTime(2016,12,31) },
};

List<Bar> bars = new List<Bar> {
   new Bar { Id=44, Value=859, Date=new DateTime(2016,12,8) },
   new Bar { Id=23, Value=851, Date=new DateTime(2016,12,7) },
   new Bar { Id=31, Value=785, Date=new DateTime(2016,12,9) }
};

您还可以创建自定义类型来保存组合数据。

public class Result
{
    public int FooId {get; set; }
    public string Name {get; set; }
    public int Value {get;set;}
    public int? BarId {get;set;}
    public DateTime? Date {get; set;}
}

获得结果看起来像

var results = foos.Zip(bars, (f, b) => new Result{ 
    FooId = f.Id, Name = f.Name, Value = f.Value + b.Value, BarId =  b.Id, Date = b.Date
}).Concat(foos.Skip(bars.Count).Select(f => new Result {
    FooId = f.Id, Name = f.Name, Value = f.Value
}));

Try Working Code