我如何LINQify这个?

时间:2008-10-08 17:17:22

标签: c# .net linq

有没有办法用LINQ清理这种类型的循环?

  List<Car> result;
  List<string> makes;
  List<string> models;

  for (int i = 0; i < makes.Count() && i < models.Count(); i++)
  {
    result.Add(new Car() { Make = makes[i], Model = models[i] });
  }

基本上我正在寻找一些方法来将单个字段的多个数组整理成由这些字段组成的单个对象数组。

4 个答案:

答案 0 :(得分:7)

您可以使用Enumerable.Range,如下所示:

List<Car> result = Enumerable.Range(0, Math.Min(makes.Count, models.Count))
    .Select(i => new Car { Make = makes[i], Model = models[i] }).ToList();

如果makesmodels始终包含相同数量的项目,则可以使用更紧凑的语法:

List<Car> result = makes.Select((make, i) => new Car { Make = make, Model = models[i] }).ToList();

答案 1 :(得分:4)

听起来你真的需要一个新的LINQ操作符 - 一个不包含在LINQ中的操作符,有点意外:Zip。它基本上需要两个枚举并返回一个可枚举的配对条目,直到原始序列中的一个或另一个完成。

我的袖子里没有这样的东西,但如果你感兴趣的话,写作不应该花太长时间。结果代码如下:

List<Car> cars = makes.Zip(models)
                      .Select(pair => new Car(pair.First, pair.Second))
                      .ToList();

如果您对此感兴趣,请告诉我,我会在MiscUtil中对其进行编码。

答案 2 :(得分:1)

根据您需要针对这些数组编写LINQ查询的频率,可能需要构建一个包装数组并实现IEnumerable<Car>的类。然后您的代码如下所示:

IEnumerable<Car> cars = new MyClass(makes, models);
var result = from cars...

构建它并不是特别复杂;它只是四个简单的方法(好吧,六个,如果算上构造函数)分布在两个类中(你还需要实现IEnumerator<Car>)。

这种方法使您不必在所有LINQ查询中嵌入实现细节。此外,如果你从未这样做过,那真的值得学习。轻松实现IEnumerable<T>可以显着扩展您可以轻松使用LINQ for的东西。

答案 3 :(得分:1)

List<Car> result = makes
                   .Take(model.Count)
                   .Select((make, index) => new Car {Make = make, Model = models[index]});

请注意,即使品牌和型号的长度不同,这也有效。