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

Unit Testing Interface and abstract memebers using shims in Visual Studio 2013
WPF - DataGrid Default sorting does not work
SQL format error for insert query
Removing ifs based on type and list of parameters
IEDriver, c#, modify delay between characters in sendKeys
Linq to Entities figure out count of rows without returning rows
Detecting multiple key presses in C# and XNA 4.0
Entity Framework mapping error
Async error of {“Parameter is not valid.”} when working with windows forms
System invalid operator error when connecting to a SQL Server database
How to get the databases set up when Publishing an ASP.NET MVC project in Visual Studio
crystal report parameter incorrect
Image in PictureBox Become Blurry While Rotating
Sitecore DataProvider with multiple tables
HttpContext is null in the controller during Unit Testing in Asp.net MVC [duplicate]
C# Regex.Replace with existing word

Categories

HOME
qlikview
ckan
oracle-sqldeveloper
salesforce
customization
gap-system
jquery-plugins
qt4
jquery-select2
vsixmanifest
token
facebook-sharer
suitecrm
vichuploaderbundle
fastreport
opengrok
bookmarklet
ringcentral
url-parameters
jq
hololens
pushbullet
policy
ppp
my.cnf
scalatest
nsopenpanel
2checkout
scene7
azure-vm-scale-set
realloc
server-side-swift
rbac
vertical-alignment
aspnetboilerplate
test-kitchen
taiga
risc
spring-ide
line-endings
hierarchical-clustering
emacs24
flask-socketio
android-vectordrawable
zedgraph
suitesparse
alfred
hana-sql-script
datamodel
apache2-module
bioconductor
tvp
textblob
callfire
clearquest
vectordrawable
teamwork
genome
minko
httpmodule
service-broker
quickfixn
react-os
lwuit
pnunit
debuggervisualizer
nodeunit
class-library
mongoid4
node-amqp
aspnet-compiler
playing-cards
usersettings
http-compression
spawn
biztalk-deployment
mail-gem
xcode4.6.3
pdf-reader
copyfile
jqzoom
mscorlib
opendir
sipdroid
text-manipulation
nyromodal
glassfish-embedded
pkcs#7
datadude
html-help-workshop
asp.net-1.1
paperless

Resources

Database Users
RDBMS discuss
Database Dev&Adm
javascript
java
csharp
php
android
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App