C# 调用实例方法的LINQ查询

C# 调用实例方法的LINQ查询,c#,linq,C#,Linq,我已经编写了一些具有此表单的代码: var queryResult = from instance in someCollection where instance meets some criteria select instance; foreach (InstanceType instance in queryResult.ToList()) { instance.SomeMethod(); } 这似乎有点多余,因为查询在集合上进行迭代,然后有另一个迭代在所有找到的实

我已经编写了一些具有此表单的代码:

var  queryResult = from instance in someCollection
  where instance meets some criteria
  select instance;

foreach (InstanceType instance in queryResult.ToList()) {
    instance.SomeMethod();
}
这似乎有点多余,因为查询在集合上进行迭代,然后有另一个迭代在所有找到的实例上调用该方法。如果能够在查询中使用调用实例方法,而不必编写额外的循环,那就太好了


一个人怎么能只用一个查询就完成上面的代码呢?

您可以使用
ForEach
调用
void
方法:

someCollection
    .Where(instance => instance meets some criteria)
    .ToList()
    .ForEach(item => item.SomeMethod(param1, param2, ...)); // Use Foreach(SomeMethod) for methods w/no args

您可以使用
ForEach
调用
void
方法:

someCollection
    .Where(instance => instance meets some criteria)
    .ToList()
    .ForEach(item => item.SomeMethod(param1, param2, ...)); // Use Foreach(SomeMethod) for methods w/no args

只需从代码中删除
.ToList()
。。而你只会在集合中循环一次

一般来说,建议不要在查询中产生副作用。。像
instance.SomeMethod()
这样的方法通常是副作用


除了删除ToList调用(这实际上是这里的附加和冗余循环)之外,代码片段在我看来还不错。

只需从代码中删除
.ToList()
。。而你只会在集合中循环一次

一般来说,建议不要在查询中产生副作用。。像
instance.SomeMethod()
这样的方法通常是副作用


除了删除ToList调用(这里实际上是额外的冗余循环)之外,代码片段在我看来还不错。

看起来更好一些。我不确定迭代的实际次数

foreach (var instance in someCollection.Where(instance meets some criteria))
{
    instance.SomeMethod();
}  

看起来好多了。我不确定迭代的实际次数

foreach (var instance in someCollection.Where(instance meets some criteria))
{
    instance.SomeMethod();
}  


取决于源是什么(数据库、集合等),以及SomeMethod实际做了什么。。无论哪种方式,我们都有一个很好的优化代码的站点:而且查询不是“在集合上迭代”,它只是创建一个IQueryable或IEnumerable(取决于您使用的linq类型)。在你的foreach方法出现之前,没有任何东西会被枚举(你可以有100万个元素或1个元素,只要你没有具体化它,就需要完全相同的时间来计算queryResult,没有任何事情发生)。我在发布这个问题后不久了解到,在foreach循环执行之前,查询不会被枚举。这就解释了为什么我试图调用这个方法的东西从来都不起作用。我不知道是否存在调用查询的显式机制。如果不是,我想这意味着我应该做些不同的事情来完成我想做的事情。@Tron在阅读了你最近的评论后,似乎你在暗示你对这个问题的理解已经改变了。。是这样吗?如果是这样的话,请随意发布一个新问题。我不确定我对这个问题的理解是否有必要改变。我想我只是理解,当我在发布之前搜索答案时,为什么我尝试的事情没有任何效果,因为我试图在查询定义本身中实现所有事情,并且由于查询在刚定义时从未执行过,所以什么都没有发生。我仍然在想,除了使用查询之外,我想做的是否更好,因为它看起来可能依赖于副作用。这对我来说并不完全清楚。这取决于源代码是什么(数据库、集合等),以及SomeMethod实际做了什么。。无论哪种方式,我们都有一个很好的优化代码的站点:而且查询不是“在集合上迭代”,它只是创建一个IQueryable或IEnumerable(取决于您使用的linq类型)。在你的foreach方法出现之前,没有任何东西会被枚举(你可以有100万个元素或1个元素,只要你没有具体化它,就需要完全相同的时间来计算queryResult,没有任何事情发生)。我在发布这个问题后不久了解到,在foreach循环执行之前,查询不会被枚举。这就解释了为什么我试图调用这个方法的东西从来都不起作用。我不知道是否存在调用查询的显式机制。如果不是,我想这意味着我应该做些不同的事情来完成我想做的事情。@Tron在阅读了你最近的评论后,似乎你在暗示你对这个问题的理解已经改变了。。是这样吗?如果是这样的话,请随意发布一个新问题。我不确定我对这个问题的理解是否有必要改变。我想我只是理解,当我在发布之前搜索答案时,为什么我尝试的事情没有任何效果,因为我试图在查询定义本身中实现所有事情,并且由于查询在刚定义时从未执行过,所以什么都没有发生。我仍然在想,除了使用查询之外,我想做的是否更好,因为它看起来可能依赖于副作用。这对我来说并不完全清楚。这并没有改变这样一个事实,即一个人在列表上循环两次(一次用.ToList实现查询),然后再用ForEach实现查询。除此之外,ForEach调用本身甚至不是查询的一部分。。它是列表上的方法调用。。这种方法只会让它看起来像一行有副作用的代码。这并没有改变这样一个事实:一行在列表上循环两次(一次用.ToList实现查询),然后用ForEach再次循环。除此之外,ForEach调用本身甚至不是查询的一部分。。它是列表上的方法调用。。这种方法只会使它看起来像一行有副作用的代码。。。!不是吗?@gyan1991-最终代码使用for each循环遍历可枚举项。。queryResult是一个IEnuermable,我们从ToList()得到的列表也是。即使您使用IEnuermable,您仍然必须转换为与您的集合相同的已知类型才能在代码中读取和重复使用,不是吗?我试图做的全部工作就是查找所有成员