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

时间:2009-05-29 21:22:52

标签: c# vb.net linq .net-3.5 ienumerable

所以我有一个由Bloop集合创建的Razzies集合。我使用Linq查询检索此集合。参考:Linq Select Certain Properties Into Another Object?用于查询。

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

我试过了:

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

但它什么也没有回报。

5 个答案:

答案 0 :(得分:2)

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

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

编辑由于您使用的是密封的第三方课程,因此请使用扩展方法。这就是他们的目的。 ;)修改代码以使用扩展方法。

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<Razzie>
            {
                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();
    }
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

<Extension>
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

答案 3 :(得分:0)

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

var results = from ... select new { Address = item.Address, Razzie = new Razzie { ... }}

foreach (var result in results)
{
    result.Razzie.UpdateAddress(result.Address);
}

答案 4 :(得分:0)

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

public static IEnumerable<TOutput> ConvertAll<T, TOutput>(this IEnumerable<T> collection, Converter<T, TOutput> converter)
{
    if (converter == null)
        throw new ArgumentNullException("converter");

    List<TOutput> list = new List<TOutput>();

    foreach (T item in collection)
    {
        list.Add(converter(item));
    }

    return list;
}

public static void ForEach<T>(this IEnumerable<T> collection, Action<T> action)
{
    foreach (T item in collection)
    {
        action(item);
    }
}

然后你可以打电话给:

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