C#使用Linq Union方法和yield

时间:2016-03-16 07:08:25

标签: c# linq

我只是想了解几乎相似代码的不同输出。唯一的区别是,在第一种情况下,我暂时存储查询,然后进行联合。在第二种情况下,我在一个声明中这样做。

首先输出
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;
    }
}

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());这样的代码,但这是有效的。