Bad practice? Not at all.
Performance may be affected, though, depending on the situation. For example, this:
persons.Select(x => x.name).Select(x => x.name + " more");
May work better than this:
foreach(string name in persons.Select(x => x.name)) { someList.Add(name + " more"); }
... if you use something like the Entity Framework, where name + " more" will happen on the database side compared to the local memory in the first example.
The best practice, in my opinion, is to go with what is most readable, and then if you run into performance problems, you can set up a profile. Sometimes it is clearer to use LINQ to create IEnumerable, but foreach to create more complex things. If the LINQ part is too long, I would go with:
var somethings = something.Where(x => x == 1).Where(...).GroupBy(...etc); foreach(var something in somethings) {
source share