0

所以我有一个从 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)

但它什么也不返回。

4

5 回答 5

2

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

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

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

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();
    }
}
于 2009-05-29T21:45:55.860 回答
1

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

于 2009-05-29T21:31:27.403 回答
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
于 2009-05-29T21:25:50.380 回答
0

为什么不以正常的、未经评估的方式这样做呢?你可以用扩展方法做很多花哨的事情......但是你可能会通过使用扩展方法执行更新来打破纯度规则......这也让事情变得难以理解。试试这个:

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

foreach (var result in results)
{
    result.Razzie.UpdateAddress(result.Address);
}
于 2009-05-29T22:08:31.760 回答
0

如果您希望抽象出 foreach 循环,我只需为 IEnumerable<T> 编写一个扩展方法,该方法复制 List<T> 的 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());
于 2009-05-29T22:12:03.407 回答