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

Where can I find the source code for System.Numerics.BigInteger? [closed]
Actions/AsyncCallbacks and Memory Allocation
use code behind to pop aspx confirmation message
Custom control derived from Component - OnCreate event?
Socket server stops receiving message from client after sometime. C#
Windows Form Application - Having to close the form and open again? [closed]
Unrecognized array error [closed]
How to connect two different windows forms keeping both open
Use .xsd file validate data
Avalonedit How to invalidate Line Transformers
How to break the registry dependency?
Reactive: Trying to understand how Subject<T> work
Stop inheriting from user agent
DataGridView CellTemplate setting not working properly
C# Winform app with google Drive API. Way to automate login?
ArgumentNullException - how to simplify?

Categories

HOME
actionscript-3
kendo-ui
compression
weblogic
opencv4android
gaussian
hiveql
ebay
multipartform-data
symfony-3.2
open-search-server
browserstack
handlebars.js
genexus
spring-data-solr
facebook-sharer
dynamics-crm-2011
drush
jinja2
pylint
simd
screen-scraping
email-client
gsuite
poisson
datastax-enterprise
gulp-jshint
spock
dynamics-ax-2012-r3
federated
intermec
tikz
log4net-configuration
choco
unity3d-5
circle
jsonapi-resources
webspeech-api
dropdownbox
pyenv
respect-validation
realloc
var
jslider
susy
superclass
gradlew
inner-join
gridgain
piranha-cms
reqif
infovis
easyquery
opos
hdpi
extjs3
scrollmagic
blitz3d
portaudio
alarmmanager
change-password
sprockets
db2-zos
avaudiorecorder
phpdesigner
jcalendar
winforms-interop
data-quality-services
indices
fxmlloader
react-os
nsurlrequest
parsefloat
azure-worker-roles
fscanf
android-relativelayout
sendy
yandex-api
pidgin
logo-lang
grunt-contrib-imagemin
dylan
violation
azure-scheduler
coinbase-php
mmo
dnsbl
metapost
moonscript
teamsystem
netbiscuits
netzke
jquery-1.8
bindinglist
pinchzoom
towerjs
mcpd
noise-reduction
javah
data-formats
atmega16
ffdshow
jettison
memory-consumption





Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm