关于c#:通过LINQ将函数应用于集合的所有元素

Apply function to all elements of collection through LINQ

本问题已经有最佳答案,请猛点这里访问。

我最近刚开始和Linq合作,这太棒了。我想知道Linq是否允许我在不使用foreach的情况下将函数(任何函数)应用于集合的所有元素。类似于python lambda函数。

例如,如果我有一个int列表,我可以使用linq向每个元素添加一个常量吗?

如果我有一个DB表,我可以使用LINQ为所有记录设置一个字段吗?

我用C


一种常见的方法是在IEnumerable上添加自己的foreach泛型方法。这是我们在Morelinq得到的:

1
2
3
4
5
6
7
8
9
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    source.ThrowIfNull("source");
    action.ThrowIfNull("action");
    foreach (T element in source)
    {
        action(element);
    }
}

(其中ThrowIfNull是对任何引用类型的扩展方法,这是显而易见的。)

看看这是否是.NET 4.0的一部分会很有趣。这与Linq的功能风格背道而驰,但毫无疑问,很多人认为它很有用。

一旦你做到了,你就可以写一些东西,比如:

1
2
people.Where(person => person.Age < 21)
      .ForEach(person => person.EjectFromBar());


使用Linq执行此操作的惯用方法是处理集合并返回一个以您想要的方式映射的新集合。例如,要向每个元素添加常量,您需要

1
var newNumbers = oldNumbers.Select(i => i + 8);

以功能性的方式执行此操作,而不是改变现有集合的状态,通常可以帮助您以一种既易于阅读又便于编译器分析的方式分离不同的操作。

如果您实际希望对集合的每个元素应用一个操作(具有与集合的实际内容无关的副作用的操作),那么这并不是Linq最适合的操作,尽管您可以使用Select(或编写自己的IEnumerable扩展方法,就像许多人一样在这种情况下,最好还是使用foreach循环。


您还可以考虑并行处理,特别是如果您不关心顺序,更关心如何为每个项目完成某些工作:

1
SomeIEnumerable<T>.AsParallel().ForAll( Action<T> / Delegate / Lambda )

例如:

1
2
var numbers = new[] { 1, 2, 3, 4, 5 };
numbers.AsParallel().ForAll( Console.WriteLine );

Hth.


哈哈,伙计,我几个小时前刚刚问过这个问题(有点……试试这个:

例子:

1
someIntList.ForEach(i=>i+5);

ForEach()是内置的.NET方法之一。

这将修改列表,而不是返回新列表。


或者你可以把它拆下来。

1
Items.All(p => { p.IsAwesome = true; return true; });


对于不支持foreach的集合,可以在Parallel类中使用静态foreach方法:

1
2
var options = new ParallelOptions() { MaxDegreeOfParallelism = 1 };
Parallel.ForEach(_your_collection_, options, x => x._Your_Method_());


你可以试试

1
var foo = (from fooItems in context.footable select fooItems.fooID + 1);

返回ID的+1列表,可以对select子句中的任何内容使用函数。

更新:正如jon skeet所建议的,这是我刚刚发布的代码片段的更好版本:

1
var foo = context.footable.Select(foo => foo.fooID + 1);


我找到了一些方法来执行字典包含我的自定义类方法

1
2
foreach (var item in this.Values.Where(p => p.IsActive == false))
            item.Refresh();

其中"this"派生自:dictionary

1
2
3
4
class MyCustomClass
{
   public void Refresh(){}
}