对集合中的所有对象运行方法
所以我有一系列由一系列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
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());