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

Categories

HOME
classification
oop
pelican
windows-server-2008
magento-1.9.2.1
bitbucket
browserstack
pip
angularjs-ng-repeat
jcodemodel
point-of-sale
osrm
openstack-horizon
versioning
windows-phone
android-actionbar
virtuemart
webgl-earth
dev-c++
concatenation
v4l2
android-xml
priority-queue
suitescript
windows-mobile
utc
stack-trace
android-6.0-marshmallow
meteor-accounts
emr
dynamics-ax-2012-r3
jms-topic
ipython-parallel
jbossfuse
choco
webclient
powerbi-embedded
hippocms
stdin
qt-quick
multivalue
reloaddata
catalyst
msiexec
mac-app-store
symantec
objectify
queuing
django-taggit
avaudiorecorder
jcalendar
methodology
datamodel
ewam
nonblocking
matlab-engine
mojolicious
self-join
avrcp
photogrammetry
page-refresh
glog
radgrid
jad
drools-guvnor
apache-pivot
behance-api
debuggervisualizer
nodeunit
boofcv
facebook-likebox
lastinsertid
angularjs-select2
source-depot
infinity.js
removeall
string-length
vline
ncml
nsregularexpression
rfc822
netbiscuits
databus
bash4
wxperl
zend-validate
method-call
hwnd
http-response-codes
konsole
dgml
vista64

Resources

Encrypt Message