通过 LINQ 对集合的所有元素应用函数

我最近开始与 LINQ 和它的惊人。我想知道 LINQ 是否允许我在不使用 foreach 的情况下对集合的所有元素应用一个函数(任意函数)。有点像 python lambda 的功能。

例如,如果我有一个整型列表,我可以添加一个常量到每个元素使用 LINQ

如果我有一个数据库表,我可以设置一个字段为所有记录使用 LINQ。

我用的是 C #

221622 次浏览

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

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

通过函数的方式来实现这一点,而不是经常改变现有集合的状态,这样可以帮助您以一种既容易阅读又容易让编译器理解的方式来分离不同的操作。

如果你真的想在一个集合的每个元素上应用一个动作(一个与集合的实际内容无关的带有副作用的动作) ,这并不是 LINQ 最适合的,尽管你可以用 Select来伪造它(或者像很多人一样编写你自己的 IEnumerable扩展方法)在这种情况下,最好使用 foreach循环。

哈哈,伙计,我几个小时前才问过这个问题... ... 试试这个:

例如:

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

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

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

解决这个问题的常用方法是在 IEnumerable<T>上添加自己的 ForEach泛型方法。这是我们在 莫林克中看到的:

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 的功能风格,但是毫无疑问,许多人发现它很有用。

一旦你得到了这些,你可以这样写:

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

你可以试试

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

返回一个 id + 1的列表,您可以对 select 子句中的任何内容使用函数执行相同的操作。

更新: 正如 Jon Skeet 所建议的,这是我刚刚发布的代码片段的一个更好的版本:

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

你也可以考虑平行进行,特别是如果你不关心顺序,更关心如何完成每个项目:

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

例如:

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

高温。

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

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

‘ this’派生自哪里: Dictionary < string,MyCustomClass >

class MyCustomClass
{
public void Refresh(){}
}

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

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

或者你可以砍了它。

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