我只是想理解几乎相似的代码的不同输出。唯一的区别是,在第一种情况下,我暂时存储查询,然后进行联合。在第二种情况下,我在一个语句中做到这一点。
首次输出
宝马
本田
第二个输出
宝马
本田
哈利
恩菲尔德
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;
}
}
Union 不会追加到现有枚举,而是返回一个 NEW 枚举,从而生成两者的组合结果。
在第一个示例中,您调用联合,然后丢弃生成的枚举。
你本可以做到:
queries = queries.Union(GetBike());
在第一种情况下,您没有使用联合的结果。
代码queries.Union(GetBike());
不会修改queries
。
你可以这样称呼它,得到你想要的结果:
//First case
foreach (Vehicle v in queries.Union(GetBike()))
Console.WriteLine(v.Manufacturer);
Console.ReadLine();
我倾向于不喜欢像queries = queries.Union(GetBike());
这样的代码,但这是有效的。