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

C# 对集合中的所有对象运行方法,c#,vb.net,linq,.net-3.5,ienumerable,C#,Vb.net,Linq,.net 3.5,Ienumerable,因此,我有一个从Bloops集合创建的Razzie集合。我使用Linq查询检索此集合。参考:用于查询 我想知道是否可以在返回集合之前,甚至之后,在所有新创建的Razzie上运行一个方法,而不使用for循环 我试过这个: Dim results = From item In bloops _ Select New Razzie() With _ { _ .FirstName = item.FirstName

因此,我有一个从Bloops集合创建的Razzie集合。我使用Linq查询检索此集合。参考:用于查询

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

我试过这个:

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

但是它什么也不返回。

我不知道你说的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

公共函数RunVoid(Of T)(源作为IEnumerable(Of T),del作为Action(Of T)作为IEnumerable(Of T)
对于源中的每个cur
德尔(cur)
下一个
返回源
端函数

我不确定您所说的RunVoid是什么意思。Void表示不返回,但您将结果分配给一个值

是否运行void对每个项执行一个方法,然后返回原始集合?如果是,则没有内置方法,但可以添加类似的方法

<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

公共函数RunVoid(Of T)(源作为IEnumerable(Of T),del作为Action(Of T)作为IEnumerable(Of T)
对于源中的每个cur
德尔(cur)
下一个
返回源
端函数

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

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

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();
    }
}
class MyArgs{}
类Razzie//假设这是我们无法编辑的第三方类
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
静态类扩展
{
公共静态Razzie-MyMethod(此Razzie-Razzie,MyArgs-args)
{
razzie.FirstName=razzie.FirstName.ToUpper();
返回拉齐;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var bloops=新列表
{
新Razzie{FirstName=“name”},
新Razzie{FirstName=“nAmE”}
};
var myArgs=新的myArgs();
var结果=来自bloops中的项目
选择新Razzie
{
FirstName=item.FirstName,
LastName=item.LastName
}.MyMethod(myArgs);
foreach(结果中的var r)
Console.WriteLine(r.FirstName);
Console.ReadKey();
}
}

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();
    }
}
class MyArgs{}
类Razzie//假设这是我们无法编辑的第三方类
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
静态类扩展
{
公共静态Razzie-MyMethod(此Razzie-Razzie,MyArgs-args)
{
razzie.FirstName=razzie.FirstName.ToUpper();
返回拉齐;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var bloops=新列表
{
新Razzie{FirstName=“name”},
新Razzie{FirstName=“nAmE”}
};
var myArgs=新的myArgs();
var结果=来自bloops中的项目
选择新Razzie
{
FirstName=item.FirstName,
LastName=item.LastName
}.MyMethod(myArgs);
foreach(结果中的var r)
Console.WriteLine(r.FirstName);
Console.ReadKey();
}
}

为什么不以正常的、非估价的方式来做呢?你可以用扩展方法做一大堆花哨的事情…但是你可能会通过用扩展方法执行更新来打破纯度规则…这也让事情变得难以理解。试试这个:

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

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

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

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<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);
    }
}

如果您想抽象掉foreach循环,我只需要为IEnumerable编写一个扩展方法,复制List的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);
    }
}

是的,我正在尝试对每个项目运行该方法,然后返回原始集合。原因是该方法设置了一些我无法直接访问的“只读”属性。你是说我被一个循环卡住了?@Russ,你被定义一次循环卡住了。既然你