C# 使用具有产量的 Linq Union 方法

  • 本文关键字:Linq Union 方法 c# linq
  • 更新时间 :
  • 英文 :


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

首次输出
宝马
本田

第二个输出
宝马
本田
哈利
恩菲尔德

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

最新更新