迭代参数,调用方法并将结果传递给另一个函数

时间:2018-03-15 10:51:55

标签: c#

我有一个使用params关键字的函数允许我将多个对象传递给它:

public IEnumerable<MyObject> GetMyObjects(params FilterObject[] filters)
  return service.GetObjectsFromDatabase(filters);
}

因此它可以被称为:

GetMyObjects(filter1, filter2, filter3);

我的问题是我需要在调用第二个函数之前将传递给函数的每个对象转换为另一个类型,该函数也使用params关键字。第二个函数如下:

public IEnumerable<MyObject> GetObjectsFromDatabase(params AnotherType[] filters) 
{
  _database.GetObjectsFromDatabase(filters);
}

我假设我需要循环遍历每个参数并调用执行转换的方法,但是如何存储每个转换后的对象以便能够将它们传递给下一个函数?

我想象它会是这样的:

public IEnumerable<MyObject> GetMyObjects(params FilterObject[] filters)
  List<AnotherType> myList = new List<AnotherType>();
  foreach (FilterObject f in FilterObjects) {
   AnotherType a = f.ConvertToAnotherType();
   myList.Add(a);
  }
  return service.GetMyObjects(myList);
}

但是这不起作用,因为第二个函数不接受List。传递这些对象的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

params - 数组是一个不是列表的数组,因此请使用:

public IEnumerable<MyObject> GetMyObjects(params FilterObject[] filters)
  AnotherType[] atArray = filters.Select(f => f.ConvertToAnotherType()).ToArray();
  return service.GetMyObjects( atArray );
}

而不是LINQ,你也可以使用Array.ConvertAll

AnotherType[] atArray = Array.ConvertAll(filters, f => f.ConvertToAnotherType());

答案 1 :(得分:1)

最简单的解决方案是在列表上调用.ToArray(),但它会迭代集合两次,这会增加不必要的开销。你可以这样做:

public IEnumerable<MyObject> GetMyObjects(params FilterObject[] filters)
{
   var myArray = new AnotherType[filters.Length];
   for (int i = 0; i < myArray.Length; i++) 
   {
      myArray[i] = filters[i].ConvertToAnotherType();
   }
   return service.GetMyObjects(myArray);
}

或者使用LINQ。根据Tim Schmelter的建议选择