在foreach循环声明中直接声明LINQ是不好的做法吗?在表现或微妙的行为差异方面。
例如:
foreach (string name in persons.Select(x => x.name))
{
//Do something with name
}
答案 0 :(得分: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
}
答案 1 :(得分: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
}