Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并对象数组c的列表_C#_Linq - Fatal编程技术网

C# 合并对象数组c的列表

C# 合并对象数组c的列表,c#,linq,C#,Linq,我有一个对象数组列表,它来自不同的源文件、sql、WebService,我需要一种方法来连接它们。 例如,我有两个列表: List<object[]> listA = new List<object[]>(); object[] a = new object[] { 1, "A", 1200, "2016-12-31" }; listA.Add(a); a = new object[] { 2, "B", 5

我有一个对象数组列表,它来自不同的源文件、sql、WebService,我需要一种方法来连接它们。 例如,我有两个列表:

        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中找到了这样做的方法,那就是一半了。
有什么想法吗?

您可以使用列表中的左侧项目压缩序列和concat:

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 }))
您还可以使用组联接或通过第一个列表中项目的索引从第二个列表中选择项目

我还建议您使用自定义类而不是对象数组,以提高代码的可读性,获得良好的类型检查、描述性属性和智能感知。例如

public class Foo
{
   public int Id { get; set; }
   public string Name { 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) }
};
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
}));
而得到的结果看起来就像

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

请告诉我们您必须遵循的模式?C语言具有非常严格、静态和高级的类型系统。为什么所有这些值都作为对象存储在数组中。是什么阻止您为业务数据设计好的类型?这当然也会使合并它们变得更容易。另外,我们会理解你在这里试图合并的内容。@RenéVogt说了什么。真正地使用类而不是对象数组来存储数据。这段代码看起来很糟糕。@Camo用你的符号,你的意思是[A,B,C,]+[D,E,F]=[A+D,B+E,C+F]?我看不出所需的输出与两个源代码列表的压缩有什么关联……事实上,是的。别理我。这是一个很好的解决方案,我不知道Zipin是你的Foo/Bar示例,我会使用DateTime?相反,谢谢,但我可以使用自定义类,因为数据来自不同的源bdd和web服务,我以前不知道它们的结构。我有另一个类,它解释了对象[]中的内容以及合并这两个对象的方式