c#
Append single item to list in linq statement
Out of curiosity, I'd like to add an element to an enumerable from within a linq flow, without exiting the flow or casting the single element to an array. So instead of this: myEntity.SelectMany(e => e.SubEntities.Concat(new []{e})).yadayadayada I want a different command where I wouldn't need to wrap the single element into an array: myEntity.SelectMany(e => e.SubEntities.SomeBuiltInFunc(e)).yadayadayada or myEntity.SelectMany(e => e.SubEntities.ToList().SomeBuiltInFunc(e)).yadayadayada or myEntity.SelectMany(e => SomeBuiltInFunc(e.SubEntities, e).yadayadayada Any construct in the language currently I'm missing that could do this, without creating a new custom function or extension method.
Interesting. First of all, you can't add elements to IEnumerable because not all IEnumerable are collections, for example. In order to achieve what you want, you'll need to eventually convert that IEnumerable into something like a List, for example. I guess you're looking for extension methods, which is one possible solution I could figure out: public class Entity { public IEnumerable<Entity> SubEntities { get; set; } } public static class EnumerableExtensions { public static IEnumerable<T> SomeBuiltInFunc<T>(this IEnumerable<T> enumerable, T item) { var list = enumerable.ToList(); list.Add(item); return list; } } ...then you could call it like this: IEnumerable<Entity> myEntities = new List<Entity>(); var entity = new Entity(); myEntities = myEntities.SelectMany(e => e.SubEntities.SomeBuiltInFunc(entity)); Take note I changed your myEntity to myEntities because SelectMany() is a built-in extension method from IEnumerable<T>. Also, if you need to pass an entire IEnumerable<T> as argument to your BuiltInFunc(), just change it to something like: public static IEnumerable<T> SomeBuiltInFunc<T>(this IEnumerable<T> enumerable, IEnumerable<T> item) { var list = enumerable.ToList(); list.AddRange(item); return list; } ...then now: IEnumerable<Entity> myEntities = new List<Entity>(); var entity = new Entity(); myEntities = myEntities.SelectMany(e => e.SubEntities.SomeBuiltInFunc(myEntities)); Finally, change the name of the SomeBuiltInFunc(), since it's not actually built-in. I just want to make clear the problem with this solution is we might not preserve the original concrete type of the IEnumerable. While the idea of working with interfaces is not caring at all about the implementation details (what is the concrete type), there might be situations where it does difference changing the concrete type. So you either find a way to solve this, or be careful whether this would be a problem for you or not.
recursive's answer was pretty good, I wonder how Enumerable.repeat(e, 1) compares to new [] {e}
Related Links
datagridview data to list, then binding listbox to list, doesnt work?
Remove Seconds from DateTime c#
Required field Validation in WPF text box
Deleting a folder from database
Multiple numbers from strings with-out regex
ASP.NET Core 1.1 can't Publish App
Reference object in two classes C#
When to use built in ASP.NET login control
Visual Studio : can't find “resource file” in list of items to add to project
C# server and client communication - send/receive data
UWP XAML editor doesn't work
C # fill datatable using loops - how?
MVVM Setting GridViewColumn width dynamically
Instantiate tricky class in C#
Update nested elements using ASP.NET core with json patch
Nunit - How to skip test setup to call for particular unit test case