将两个序列组合成不同类型

时间:2015-10-25 16:34:28

标签: c# linq collections

我有两个类定义如下:

class Foo
{
  public string name {get; set;}
  public long number {get; set;}
}

class Bar
{
  //some properties

  public string otherName {get; set;}
  public long otherNumber {get; set;}
}

如何将这两种类型的两个IEnumerable序列组合成一个新的匿名类型,该类型包含两个类的属性组合。

示例:

Foo:
name1 - number1
name2 - number2
name3 - number3

Bar:
otherName1 - otherNumber1
OtherName2 - otherNumber2

Desired Result:
name1 - number1
name2 - number2
name3 - number3
otherName1 - otherNumber1
OtherName2 - otherNumber2

我在linq中尝试了Zip功能而没有运气。

3 个答案:

答案 0 :(得分:6)

使用此:

    var result = efoo.Select(x => new { x = x.name, y = x.number })
                     .Concat(ebar.Select(x => new { x = x.otherName, y = x.otherNumber }));

result是一个匿名类型的枚举,其中xy为属性。您可以使用正常的foreach循环遍历此序列:

   foreach (var i in result)
   {
        string name = i.x;
        long number = i.y;
   }

答案 1 :(得分:2)

我不知道连接的重点是什么,以及后来的用途是什么。您可以将其投射到IEnumerable<object>,然后执行Concat,例如:

var result = foos.Cast<object>().Concat(bars.Cast<object>());

理想的方法是使用公共基类或接口,并使用它代替object

答案 2 :(得分:0)

var result = FooList.Select(t=> new { a = t.name, b = t.number})
                    .Concat(
                       BarList.Select(t => new { a = t.othername, b = t.othernumber}));

如果你想“合并”结果,那么使用Union而不是Concat - 但在这种情况下你需要一个比较函数用于元素类型。