6

直接在 foreach 循环声明中声明 LINQ 是不好的做法吗?在性能或细微的行为差异方面。

例如:

foreach (string name in persons.Select(x => x.name))
{
    //Do something with name
}
4

2 回答 2

5

没有。没有错。只要 Linq 表达式简短易读,我会说这是最重要的。您的示例是一个很好的示例,说明何时应该以这种方式使用此类查询。

但是,如果它比这长得多,或者如果您使用查询语法,我建议将它分成两行,如下所示:

var names = persons.Select(x => x.name).Blah().Blah().Blah();
foreach (string name in names)
{
    //Do something with name
}

或者

var names = 
    from x in persons
    select x.name;
foreach (string name in names)
{
    //Do something with name
}
于 2013-06-03T01:36:26.823 回答
3

不好的做法?一点也不。

不过,性能可能会受到影响,具体取决于具体情况。例如,这个:

persons.Select(x => x.name).Select(x => x.name + " more");

可以表现得比这更好:

foreach(string name in persons.Select(x => x.name))
{
    someList.Add(name + " more");
}

...如果您使用的是实体框架之类的东西,name + " more"在第一个示例中,这将发生在数据库端与本地内存之间。

我认为最好的做法是使用最易读的东西,然后如果您遇到性能问题,您可以分析/调整。有时使用 LINQ 构建 IEnumerable 更清晰,但 foreach 可以做一些更棘手的事情。如果 LINQ 部分太长,我会选择:

var somethings = something.Where(x => x == 1).Where(...).GroupBy(...etc);
foreach(var something in somethings)
{
    // Do something
}
于 2013-06-03T01:38:21.270 回答