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

QuickFix - 'ObjectDisposedException' error on NewOrderSingle
Is there any way to pre-render a WebView control with Xamarin Forms?
Locations Hierarchies in SSMS
Can't delete file after drag drop
C# WebClient allow encrypted connection only
Simplify foreach on Transform
Splitting a string and keeping only one half
How to launch Regsvr32 in an elevated command prompt via CreateProcessAsUser
windows form combobox drawmode empty list
Server Error - Could not find a part of the path 'C:\home\site\wwwroot\App_Data\Temp\1.png'
Polling SSIS execution status
Reflect cell value change in one column into another column calculation - Datagrid WPF C#
Windows Service changing its own DLL files
How to know if my WebRequest is full?
error CS0201: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement
Enum Inheritance in C# [duplicate]

Categories

HOME
internet-explorer
display
reference
jquery-plugins
arguments
salesforce-lightning
lithium
jshell
kohana
zabbix
ethereum
angular-universal
fetch
aspectj
adroitlogic
chef-recipe
derby
saucelabs
nsoperation
orange
passbook
android-wifi
procedural-generation
advertising
traveling-salesman
orgchart
gulp-jshint
folder
edirectory
boost-log
mplab
log4net-configuration
http-proxy
minitest
cocoa-scripting
kdevelop
iterm2
scalamock
aspose.pdf
usernotifications
server-side-swift
java-5
flume-ng
intervention
logan-square
infovis
spring-cloud-bus
cloudconvert
vertex
boost-regex
spring-cloud-aws
blitz3d
jspx
instaparse
normalisation
git-cherry-pick
falcon
objectify
3d-rendering
sqlxml
bbedit
oryx
google-finance-api
mojolicious
php-gd
android-togglebutton
bootstrap-tabs
hexagonal-tiles
borland-c++
log-analysis
genome
veeam
uiblureffect
nsmutableurlrequest
sat4j
atg-dynamo
winrun4j
code-smell
farpoint-spread
nodeunit
class-library
imaplib
randomaccessfile
typography
android-library
backbone-views
windows-scheduler
antixsslibrary
nsregularexpression
m3u
esi
openafs
google-email-audit-api
filedialog
nsundomanager
log-shipping
flexbuilder
gmagick
marathontesting
excellibrary
manuals
retrospectiva
weak-typing

Resources

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
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App