在foreach循环声明中使用LINQ

时间:2013-06-03 01:28:08

标签: .net linq foreach

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

例如:

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

2 个答案:

答案 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
}