对集合中的所有对象运行方法

所以我有一系列由一系列Bloops创建的Razzies。 我使用Linq查询检索此集合。 参考: Linq选择某些属性到另一个对象? 用于查询。

我想知道是否可以在返回集合之前在所有新创建的Razzies上运行一个方法,或者甚至在不使用for循环之后立即运行。

我试过这个:

Dim results = From item In bloops _ Select New Razzie() With _ { _ .FirstName = item.FirstName, _ .LastName = item.LastName _ }.UpdateAddress(item.Address) 

但它什么也没有回报。

拉斯,这可能会做你想要的。 这是一个非常简单的方法。 如果这不是您想要的,请扩展您的问题。

这将在您枚举它们时对每个元素运行该方法。 在枚举之前它不会运行该方法,但您可以安全地知道该方法在您使用数据之前运行。

编辑因为您使用密封的第三方类,所以使用扩展方法。 这就是他们的目的。 ;)修改代码以使用扩展方法。

 class MyArgs { } class Razzie //pretend this is a 3rd party class that we can't edit { public string FirstName { get; set; } public string LastName { get; set; } } static class RazzieExtensions { public static Razzie MyMethod(this Razzie razzie, MyArgs args) { razzie.FirstName = razzie.FirstName.ToUpper(); return razzie; } } class Program { static void Main(string[] args) { var bloops = new List { new Razzie{FirstName = "name"}, new Razzie{FirstName = "nAmE"} }; var myArgs = new MyArgs(); var results = from item in bloops select new Razzie { FirstName = item.FirstName, LastName = item.LastName }.MyMethod(myArgs); foreach (var r in results) Console.WriteLine(r.FirstName); Console.ReadKey(); } } 

在初始处理之后使用foreach循环是执行此操作的常规方法。 如果您不想使用foreach循环,则需要定义自己的扩展方法来处理这种情况。

我不确定你的意思是RunVoid。 Void表示没有返回,但您将结果分配给值。

你是RunVoid在每个项目上执行一个方法,然后返回原始集合? 如果是这样,没有内置方法,但你可以添加一个这样的方法。

  Public Function RunVoid(Of T)(source As IEnumerable(Of T), del As Action(Of T) As IEnumerable(Of T) For Each cur in source del(cur) Next return source End Function 

为什么不以正常的,无价值的方式做到这一点? 你可以使用扩展方法做一些花哨的东西……但你可能通过使用扩展方法执行更新来破坏纯度规则……这也使得事情很难理解。 试试这个:

 var results = from ... select new { Address = item.Address, Razzie = new Razzie { ... }} foreach (var result in results) { result.Razzie.UpdateAddress(result.Address); } 

如果你想抽象出foreach循环,我只想为IEnumerable 编写一个扩展方法,它复制List 的ConvertAll和ForEach方法,如下所示:

 public static IEnumerable ConvertAll(this IEnumerable collection, Converter converter) { if (converter == null) throw new ArgumentNullException("converter"); List list = new List(); foreach (T item in collection) { list.Add(converter(item)); } return list; } public static void ForEach(this IEnumerable collection, Action action) { foreach (T item in collection) { action(item); } } 

然后你可以打电话给:

 bloops .ConvertAll(bloop => new Razzie() { FirstName = bloop.FirstName, Lastname = bloop.LastName }) .ForEach(razzie => razzie.UpdateAddress());