我只是想了解几乎相似代码的不同输出。唯一的区别是,在第一种情况下,我暂时存储查询,然后进行联合。在第二种情况下,我在一个声明中这样做。
首先输出
BMW
本田
第二输出
BMW
本田
哈雷
恩菲尔德
static void Main(string[] args)
{
var queries = GetCar().Cast<Vehicle>();
queries.Union(GetBike());
var queries1 = GetCar().Cast<Vehicle>().Union(GetBike());
//First case
foreach (Vehicle v in queries)
Console.WriteLine(v.Manufacturer);
Console.ReadLine();
//Second case
foreach (Vehicle v in queries1)
Console.WriteLine(v.Manufacturer);
Console.ReadLine();
}
public static IEnumerable<Car> GetCar()
{
for(int i=0; i<2; i++)
{
Car car = new Car();
if(i == 0)
{
car.Manufacturer = "BMW";
car.Model = "7 series";
}
else
{
car.Manufacturer = "Honda";
car.Model = "Civic";
}
yield return car;
}
}
public static IEnumerable<Bike> GetBike()
{
for (int i = 0; i < 2; i++)
{
Bike bike = new Bike();
if (i == 0)
{
bike.Manufacturer = "Harley";
bike.Model = "NightRod";
}
else
{
bike.Manufacturer = "Enfield";
bike.Model = "Bullet";
}
yield return bike;
}
}
}
public class Vehicle
{
public Vehicle()
{
}
public int NoOfWheels;
public string Manufacturer;
public string Model;
}
public class Car : Vehicle
{
public Car():base()
{
NoOfWheels = 4;
}
}
public class Bike : Vehicle
{
public Bike() : base()
{
NoOfWheels = 2;
}
}
答案 0 :(得分:5)
Union不会附加到现有的枚举,而是返回一个新的枚举,从而产生两者的组合结果。
在您的第一个示例中,您正在调用union,然后丢弃生成的枚举。
你可以做到:
queries = queries.Union(GetBike());
答案 1 :(得分:3)
在第一种情况下,您没有使用联盟的结果。
代码queries.Union(GetBike());
不会修改queries
。
您可以这样称呼它并获得您正在寻找的结果:
//First case
foreach (Vehicle v in queries.Union(GetBike()))
Console.WriteLine(v.Manufacturer);
Console.ReadLine();
我倾向于不喜欢像queries = queries.Union(GetBike());
这样的代码,但这是有效的。