在Linq查询中调用函数

在Linq查询中调用函数,linq,Linq,如果我想遍历集合,并对集合中的每个元素调用函数,我可以使用: foreach (var obj in objColl) { MyFunction(obj); } 如果我想使用linq执行此操作,我可以使用以下任一选项: //#1 var unused = (from var obj in objColl select MyFunction(obj)).ToList(); //#2 var unused = objColl.Select(obj => MyFunction(obj

如果我想遍历集合,并对集合中的每个元素调用函数,我可以使用:

foreach (var obj in objColl)
{
    MyFunction(obj);
}
如果我想使用linq执行此操作,我可以使用以下任一选项:

//#1
var unused = (from var obj in objColl select MyFunction(obj)).ToList();

//#2
var unused = objColl.Select(obj => MyFunction(obj)).ToList();
我知道这样行得通,但似乎不对。当然,我的实际情况是更复杂的查询,但归根结底是这样的,因为我可以使用Linq构建IQueryable并遍历它并调用函数

编辑: 这是我所做的一个例子。(第#项是我不能透露的事情)


使用简单的
foreach
,因为您显然希望对集合中的对象执行操作(和/或使用),而不是希望对序列中的项目进行投影/筛选/分组/等等。LINQ是关于后一组操作的

编辑:对于您的更新,我只需创建一个查询,然后在foreach中迭代查询以执行操作

var query = from Item7 in dal.GetAgencyConvertions().Where(age => age.SourceName == "Item1" && age.TargetName == "Item2") 
            join Item6 in dal.GetAgencyConvertions().Where(age => age.SourceName == "Item2" && age.TargetName == "Item3") on Item6.TargetValue equals Item7.SourceValue  
            join agency in dal.GetAgencies() on Item7.SourceValue equals agency.Agency 
            orderby Item7.TargetValue 
            select new { ID = agency.ID, Value = Item7.TargetValue };

foreach (var item in query)
    vl.ValueListItems.Add(item.ID, item.Value);
坦率地说,代码中发生了相同的循环,您只需使用
ToList()
扩展方法来屏蔽它。作为一个副产品,您正在创建一个不打算使用的值列表,同时在某种程度上混淆了代码的真正意图,所有这些都是为了保存一些字符

通常,查询不应该有任何副作用(即,它不应该修改应用程序中数据或其他数据的状态),这会引发一个问题,MyFunction是否修改了应用程序的状态?如果有,那么您应该使用
foreach
循环。

关于Each()扩展方法

public static void Each<T>(this IEnumerable<T> target, Action<T> action)
{
    if (target == null) return;
    foreach (T obj in target)
        action(obj);
}
publicstaticvoid-Each(此IEnumerable目标,操作)
{
if(target==null)返回;
foreach(目标中的目标)
行动(obj);
}

我的一个例子是创建一个价值列表。如果你不熟悉它,它是一个基础设施类的自定义词典。我将更新我的问题,使之也有这个例子。这不是一个糟糕的答案,但我认为,有一些关于为什么不这样做的问题。:)尽管CIL中的结果很可能是相同的,但为了保持代码的清晰性,我还是要这样做。谢谢
public static void Each<T>(this IEnumerable<T> target, Action<T> action)
{
    if (target == null) return;
    foreach (T obj in target)
        action(obj);
}